Вы находитесь на странице: 1из 13

Ponteiros I

Prof. Afonso Paiva


ICMC-USP

Introduo Programao de Computadores SME0330

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

Por que usar ponteiros?

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;

Introduo Programao de Computadores SME0330

Declarao de Ponteiros: Exemplos


int *a; float *v; char *c;

Introduo Programao de Computadores SME0330

Operadores de Ponteiros
Operador: &
- devolve um endereo de memria; - o endereo a posio interna ao computador da varivel. - No confunda com &&!

Introduo Programao de Computadores SME0330

Exemplo: Operador &


int x, *px; px = &x;
/* a varivel px aponta para x */

coloca em px o endereo de memria que contm a varivel x.;

Introduo Programao de Computadores SME0330

Exemplo: Operador &


Declarao
int x, *px; px MEMRIA Varivel Endereo 0434FF3 x 1124AZ9 8271YW1

????

Introduo Programao de Computadores SME0330

Exemplo: Operador &


Atribuio
px = &x; px MEMRIA Varivel Endereo 0434FF3 x 1124AZ9 8271YW1
O endereo de px 1124AZ9
????

Introduo Programao de Computadores SME0330

Operadores de Ponteiros
Operador: *
- devolve o valor da varivel localizada no endereo correspondente; - No confunda com * da multiplicao!

Introduo Programao de Computadores SME0330

Exemplo: Operador *
int x=10, y, *px; px = &x; y = *px;
/* a varivel px aponta para x */ /* y recebe o valor de px */

Introduo Programao de Computadores SME0330

Exemplo: Operador *
Declarao
int x=10, y, *px; px MEMRIA Varivel Endereo 0434FF3 x = 10 1124AZ9 y 8271YW1

????

Introduo Programao de Computadores SME0330

Exemplo: Operador *
Atribuio
y = *px; px MEMRIA Varivel Endereo 0434FF3 x = 10 1124AZ9 y = 10 8271YW1

????

Introduo Programao de Computadores SME0330

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?

Introduo Programao de Computadores SME0330

Observaes
As variveis ponteiros sempre devem apontar

para o tipo de dado correto.


Quando um ponteiro declarado como do tipo

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

Introduo Programao de Computadores SME0330

Inicializao de Ponteiros
#include <stdio.h> main(){ int x=10; int *p = &x; /* inicializao */ y = *p; }

Introduo Programao de Computadores SME0330

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.

Introduo Programao de Computadores SME0330

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

Introduo Programao de Computadores SME0330

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

Вам также может понравиться