Você está na página 1de 19

Ponteiros

Disciplina: Programao Estruturada

Prof. Kelson Rmulo Teixeira Aires


Bacharelado em Cincia da Computao DIE - CCN - UFPI

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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.

Cada tipo existente em C:


Permite um ponteiro que pode armazenar endereos de memria onde existem valores desse tipo. Ex: int a;
Declaramos uma varivel a, capaz de armazenar um valor do tipo inteiro. reservado um espao de memria capaz de guardar um valor inteiro (2 ou 4 bytes).

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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;

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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.

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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

int count = 10; int *pt; pt = &count;

0x04 0x06 0x08 0x10

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

6 / 19

Expresses com Ponteiros

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)

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

7 / 19

Incremento e Decremento de Ponteiros


Os operadores ++ e -- possuem precedncia sobre o * e operadores matemticos; Exemplos: *px++; //(sobe na memria) (*px)+1; //(soma 1 ao contedo) *(px--); //(mesmo que *px--)

Cuidado com ponteiros perdidos!!! int *p; x = 10; *p = x;


Kelson Aires (kelson@ufpi.edu.br) Prog. Estruturada - Ponteiros 8 / 19

Operaes com Ponteiros


As operaes matemticas e lgicas que se realizam com variveis podem ser realizadas com ponteiros; Exemplo: main() { int *px, *py = 2; *px = *py + 4; if(px < py) printf(px aponta para posicao inferior); }

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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.

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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); }

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

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

Ponteiros como vetores - Exemplo

#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); }

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

14 / 19

String de Ponteiros - Exemplo


#include <stdio.h> void StrCpy (char *destino, char *origem) { while(*origem) { *destino=*origem; origem++; destino++; } *destino=\0; } int main(){ char str1[100],str2[100],str3[100]; printf("Entre com uma string: "); gets (str1); StrCpy(str2,str1); StrCpy(str3,"Voce digitou a string "); printf("\n\n%s%s",str3,str2); return(0); }
Kelson Aires (kelson@ufpi.edu.br) Prog. Estruturada - Ponteiros 15 / 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]); }

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

16 / 19

Ponteiro para Ponteiro

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.

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

17 / 19

Ponteiro para Ponteiro - Exemplo

#include <stdio.h> int main() { float fpi = 3.1415; float *pf, **ppf; pf = &fpi; ppf = &pf; printf("%f", **ppf); printf("%f", *pf); return(0); }

0x02 0x06 0x10 0x14 0x18

3.1415 0x02 0x06

fpi pf ppf

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

18 / 19

Como NO usar ponteiro

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); }

Kelson Aires (kelson@ufpi.edu.br)

Prog. Estruturada - Ponteiros

19 / 19