Академический Документы
Профессиональный Документы
Культура Документы
Definio
Um ponteiro uma varivel que contm um endereo de memria. Um ponteiro armazena um endereo de memria. Esse endereo normalmente a posio de uma outra varivel na memria. O endereo apontado contm um valor especfico.
Introduo Programao de Computadores SME0330
Ponteiros fornecem os meios pelos quais as funes podem modificar seus argumentos; Usados em alocaes dinmicas; Usados para aumentar a eficincia dos cdigos.
Introduo Programao de Computadores SME0330
Declarao de Ponteiros
Devemos declarar um ponteiro de forma correta: uma declarao de ponteiro consiste no tipo bsico, um * e o nome da varivel. Sintaxe: tipo *nome;
Operadores de Ponteiros
Operador: &
- devolve um endereo de memria; - o endereo a posio interna ao computador da varivel. - No confunda com &&!
????
Operadores de Ponteiros
Operador: *
- devolve o valor da varivel localizada no endereo correspondente; - No confunda com * da multiplicao!
Exemplo: Operador *
int x=10, y, *px; px = &x; y = *px;
/* a varivel px aponta para x */ /* y recebe o valor de px */
Exemplo: Operador *
Declarao
int x=10, y, *px; px MEMRIA Varivel Endereo 0434FF3 x = 10 1124AZ9 y 8271YW1
????
Exemplo: Operador *
Atribuio
y = *px; px MEMRIA Varivel Endereo 0434FF3 x = 10 1124AZ9 y = 10 8271YW1
????
Exemplo 1
#include <stdio.h> main( ) { int x=10,y; int *px; px = &x; y = *px; }
Introduo Programao de Computadores SME0330
/* declarao */ /* atribuio */
printf("x=%d y=%d\n",x,y);
Exerccio
char tmp, ch = 'a'; char *pc; pc = &ch; tmp = *pc; Qual o valor de tmp?
Observaes
As variveis ponteiros sempre devem apontar
int o ponteiro assume que qualquer endereo que ele contenha aponta para uma varivel inteira.
A linguagem C no avisa isso ao programador!!! Vejo o prximo exemplo...
Introduo Programao de Computadores SME0330
Exemplo Errado!
#include <stdio.h> main(){ float x=10, y=20; int *p; p = &x; y = *p; }
Cuidado: alguns compiladores no acusam esse tipo de erro!!!
Introduo Programao de Computadores SME0330
Atribuio de Ponteiros
Como em qualquer varivel, um ponteiro pode ser usado ao lado direito de um comando de atribuio para passar seu valor para um outro ponteiro.
Exemplo:
char a,*p1,*p2; p1 = &a; p2 = p1;
Introduo Programao de Computadores SME0330
Exemplo 2
#include <stdio.h> main(){ int x=11; int *p1, *p2; p1 = &x; printf("p1 apos atribuicao: %d\n",*p1); printf("endereco de p1: %p\n",p1); printf("p2 antes da atribuicao: %d\n",*p2); printf("endereco de p2: %p\n\n",p2); p2 = p1; /* atribuio de ponteiro */ printf("p2 apos atribuicao: %d\n",*p2); printf("endereco de p2: %p\n",p2); }
Inicializao de Ponteiros
#include <stdio.h> main(){ int x=10; int *p = &x; /* inicializao */ y = *p; }
Inicializao de Ponteiros
Conveno
Um ponteiro que atualmente no aponta para um local de memria vlido recebe o valor nulo; Qualquer ponteiro que nulo, implica que ele no aponta para nada e no deve ser usado.
Exemplo: Inicializao
Assim como no faz sentido deixarmos de inicializar uma varivel comum: int p; printf("%d",p);
Tambm no faz sentido utilizar um ponteiro sem inicializ-lo: int *p; printf("%d", *p);
Exemplo: Inicializao
Temos que tomar um cuidado adicional com ponteiros: ele pode ter sido inicializado, mas inicializado com o valor NULL, logo no podemos fazer: int *p = NULL; printf("%d", *p); muito comum o uso de ifs para verificar se um ponteiro possui o valor NULL ou no, para s ento ser utilizado ou no. O valor especial NULL (precisamos do stdlib.h) significa que no temos nenhum endereo de memria.
Introduo Programao de Computadores SME0330
Exemplo: Inicializao
Observem que quando declaramos um ponteiro, no estamos reservando espao para armazenar um dado, estamos apenas reservando espao da memria para armazenar um endereo.
Exemplo:
int *p = NULL; O ponteiro p no apontar para nenhum endereo de memria.
Introduo Programao de Computadores SME0330
Exemplo 3
#include <stdio.h> #include <stdlib.h> main(){ char ch = 'w'; char *p = NULL; if ( p == NULL) { p = &ch; printf("O valor de p eh:%c\n",*p); } }
Introduo Programao de Computadores SME0330