Beruflich Dokumente
Kultur Dokumente
1 / 19
Ponteiros em C
Tipo que contm o endereo de uma varivel Sintaxe:
tipo *nome;
Substituem a manipulao de matrizes com ecincia; Utilizado para passar valores e mudar valores dentro de funes; Usado na alocao dinmica de memria e usado na manipulao de arquivos;
Kelson Aires (kelson@ufpi.edu.br) Prog. Estruturada - Ponteiros 2 / 19
Ponteiros em C
A linguagem C permite:
Armazenamento e manipulao de endereos de memria.
3 / 19
Ponteiros em C
De forma anloga, podemos declarar uma varivel que, ao invs de guardar o valor de uma varivel inteira, capaz de armazenar o endereo de memria onde h variveis do tipo inteiro. Sintaxe para declarao ponteiros:
No existe uma palavra reservada para declarar ponteiros; Dessa forma, utiliza-se a mesma sintaxe de declarao de variveis, utilizando * antes do nome:
int *p;
4 / 19
Ponteiros em C
Quando se declara uma varivel do tipo ponteiro, da mesma forma que variveis comuns, necessrio atribuir valores a essas variveis. A linguagem C oferece dois operadores unrios para atribuir e acessar endereos de memria:
&: endereo de:
Aplicado a uma varivel, resulta no endereo da posio de memria reservado para a varivel.
*: contedo de:
Aplicado a uma varivel do tipo ponteiro, acessa o contedo do endereo de memria armazenado pela varivel ponteiro.
5 / 19
Ponteiros - Exemplos
int x = 2, y = 3, *px, *py; px = &x; //(px aponta para x) py = &y; //(py aponta para y) y = *px; //(y recebe contedo de x) y = x; //(o mesmo que y = *px) py = px; //(py tambm aponta para x)
0x02
10 0x02
count pt
6 / 19
Ponteiros podem aparecer normalmente no lugar das variveis; O operador * dos ponteiros tem maior precedncia que as operaes matemticas; Exemplos: y = *px + 1; //(soma de 1 ao contedo de *px) y = *(px + 1); //(contedo de px + 1)
7 / 19
9 / 19
Ponteiros e Vetores
H um grande relacionamento entre ponteiros e vetores; Verses com ponteiros so mais rpidas; Ponteiros possuem mais facilidades de manipulao; Ao contrrio das matrizes, os ponteiros podem ser incrementados e decrementados diretamente.
10 / 19
Exemplo 01
main() { int a[5] = {4,5,3,8,2}, *pa, x; pa = &a[0]; // pa = a x = *(pa + 1); // x recebe a[1] for( ; x ; x -- ) printf(%d,*pa); }
11 / 19
Exemplo 02
int main() { float matrx [50][50]; float *p; int count; p = matrx[0]; for(count = 0 ; count < 2500 ; count++) { *p = 0.0; p++; } return(0); }
Kelson Aires (kelson@ufpi.edu.br) Prog. Estruturada - Ponteiros 12 / 19
Exemplo 03
int vetor[10]; int *ponteiro, i; ponteiro = &i;
As operaes a seguir so invlidas, vetor no varivel!! vetor = vetor + 2; vetor++; vetor = ponteiro; As operaes a seguir so vlidas, ponteiro varivel!! ponteiro = vetor; ponteiro = vetor+2;
Kelson Aires (kelson@ufpi.edu.br) Prog. Estruturada - Ponteiros 13 / 19
#include <stdio.h> int main() { int matriz [5] = {1, 2, 3, 4, 5}; int *p; p=matriz; printf (Terceiro elemento: %d", p[2]); return(0); }
14 / 19
Matrizes de Ponteiros
So declaradas como outro tipo qualquer de matrizes; Matrizes de ponteiros so, por exemplo, utilizadas para mensagens de erro: main(){ char *erro[2]; erro[0] = arquivo no encontrado; erro[1] = erro de leitura; for( ; *erro[0] ; ) printf(%c, *erro[0]++); printf(%s, *erro[1]); }
16 / 19
Um ponteiro para um ponteiro como se voc anotasse o endereo de um papel que tem o endereo da casa do seu amigo; Sintaxe: tipo_da_varivel **nome_da_varivel; Algumas consideraes:
**nome_da_varivel o contedo nal da varivel apontada; *nome_da_varivel o contedo do ponteiro intermedirio.
17 / 19
#include <stdio.h> int main() { float fpi = 3.1415; float *pf, **ppf; pf = &fpi; ppf = &pf; printf("%f", **ppf); printf("%f", *pf); return(0); }
fpi pf ppf
18 / 19
Devemos sempre saber para onde o ponteiro est apontando /* Errado - Nao Execute */ int main () { O valor 13 est sendo int x,*p; armazenado em um local de x = 13; memria desconhecido!! *p = x; return(0); }
19 / 19