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

Laboratrio de programao

III Linguagem C
Trabalhando com ponteiros

Roteiro
linguagem

Consideraes sobre a memria


Variveis versus memria
Ponteiros
Aritmtica de ponteiros

Consideraes sobre a memria


linguagem

O computador possui uma grande

capacidade de memria RAM, que o


programador pode utilizar em seus
programas.
Por ser muito grande, vamos utilizar
um pedao, um trecho, de memria
como exemplo.
A memria do computador
dividida em bytes. Cada pedao
laranja representa 1 byte.
Portanto, neste trecho de
memria, pego como exemplo,
ns temos 10 bytes

Trecho de memria
byte 1
byte 2
Byte 3
byte 4
byte 5
byte 6
byte 7
byte 8
byte 9
byte 10

A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

Consideraes sobre a memria


linguagem

Esses nmeros que aparecem ao lado


de cada byte representam seu endereo
(sua posio) de memria
(note que eles esto em hexadecimal)

nestes locais (bytes) que o


computador vai armazenar o
cdigo e as variveis dos
programas que voc fizer

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

Variveis versus memria


linguagem

Quando voc declara uma varivel, o compilador reserva uma regio

de memria para ela.


Essa regio de memria reservada de acordo com o tamanho do
tipo de dado para o qual a varivel foi declarada.

char c;
int ni;
float nf;
char ch[3];

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

Variveis do tipo char, que armazenam caracteres, ocupam 1 byte


Variveis do tipo int, que armazenam nmeros inteiros, ocupam
2 bytes
Variveis do tipo float, que armazenam nmeros com vrgulas (de
ponto flutuante), ocupam 4 bytes
Como cada char ocupa 1 byte, os
vetores de caracteres
(strings) ocupam tantos
bytes quantos forem
seus elementos (neste
caso so 3)

Variveis versus memria


linguagem

Portanto, cada varivel fica em um endereo de memria diferente;


Quando fazemos uma atribuio a uma varivel, o valor atribudo

colocado na regio de memria que foi reservada para ela.

char c;

Note que o endereo


da varivel c, neste
caso, A1h.

Trecho de memria
A1h
A
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

regio de memria alocada


para a varivel c (char).
c = A;

Ponteiros
linguagem

Sendo assim, ns podemos manipular o contedo de uma varivel

utilizando ela mesmo ou utilizando o seu endereo.


A linguagem C oferece um tipo especial de varivel chamado ponteiro.
Os ponteiros so variveis que armazenam endereos de outras variveis.

char c = A;
char* p= &c;

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

A
A1h

Variveis comuns
armazenam dados
Ponteiros armazenam
endereos (neste caso, o
endereo da varivel c)

Declarando ponteiros
linguagem

Os ponteiros so iguais s variveis comuns. A nica diferena est no

fato dele armazenar um endereo, e no um dado ou valor.


Para informar que voc quer declarar um ponteiro, e no uma varivel
comum, coloque o smbolo de asterisco ao lado do tipo da varivel:

char* ponteiro;
O smbolo de asterisco que vai indicar ao c que voc quer um

ponteiro e no uma varivel comum. Fora esse detalhe, a declarao


idntica a de uma varivel comum.

Declarando ponteiros
linguagem

Para cada tipo de varivel h um ponteiro especfico.


Isso significa que se voc vai armazenar o endereo de uma varivel

do tipo int, deve criar um ponteiro para int (que int*). Se for char,
um ponteiro para char (char*).
char* pc;

No exemplo acima, o C vai saber que voc est criando uma varivel

chamada pc que vai armazenar endereos de variveis do tipo char.


int* pn;

No exemplo acima, o C vai saber que voc est criando uma varivel

chamada pn que vai armazenar endereos de variveis do tipo int.

Declarando ponteiros
linguagem

Alguns exemplos:

Tipo

Varivel comum Ponteiro p/o tipo

char char letra;


int int numero;
float float num;

char* pontLetra;
int* pontNumero;
float* pontNum;

Utilizando ponteiros
linguagem

Utilizar um ponteiro simples. Como qualquer varivel, para colocar

um valor dentro dela, basta atribu-lo:

char* ponteiro = 10030; // coloca o endereo 10030 no ponteiro


Porm, os ponteiros so mais utilizados para armazenar o endereo de

outras variveis:

char c = A;
char* ponteiro = &c;

// coloca o valor A na varivel c


// coloca o endereo da varivel c no ponteiro

Note que o operador & (que retorna o endereo de uma varivel) foi

utilizado!

OBS: A princpio, voc no pode atribuir endereos de variveis que no sejam do mesmo
tipo do ponteiro: int a = 20;
char* pont = &a; // Errado, pois a no do tipo char!

Utilizando ponteiros
linguagem

Se voc mandar imprimir uma varivel do tipo ponteiro, ela vai mostrar o

endereo armazenado nela:

char c = A;
// coloca o valor A na varivel c
char* ponteiro = &c;
// coloca o endereo da varivel c no ponteiro
printf(%d, ponteiro); // imprime o contedo do ponteiro, que o
// endereo da varivel c

Trecho de memria
A1h
A2h
A3h
A4h
A5h

A
A1h

Varivel c (contendo o valor A)


Varivel ponteiro (contendo o endereo A1h)

Utilizando ponteiros
linguagem

Voc pode utilizar o ponteiro para mostrar ou manipular o contedo do endereo (da varivel)

que ele aponta.


Para fazer isso, voc deve utilizar o operador * :

char c = A;
// coloca o valor A na varivel c
char* ponteiro = &c;
// coloca o endereo da varivel c no ponteiro
printf(%d, *ponteiro); // imprime o contedo do endereo para o qual
// o ponteiro aponta ( que A )

Trecho de memria
A1h
A2h
A3h
A4h
A5h

A
A1h

Varivel c (contendo o valor A)


Varivel ponteiro (contendo o endereo A1h)

Utilizando ponteiros
linguagem

Ponteiros tambm tm endereo. Logo, voc tambm pode imprimir o seu endereo ou

armazen-lo ou utiliz-lo em um outro ponteiro:

char c = A;
// coloca o valor A na varivel c
char* ponteiro = &c;
// coloca o endereo da varivel c no ponteiro
printf(%d, &ponteiro); // imprime o endereo do ponteiro (A2h)
char** p2 = &ponteiro; // cria um ponteiro de ponteiro, e coloca o
// endereo do ponteiro l

Trecho de memria
A1h
A2h
A3h
A4h
A5h

A
A1h

Varivel c (contendo o valor A)


Varivel ponteiro (contendo o endereo A1h)

Aritmtica de ponteiros
linguagem Assim como nas variveis comuns, voc pode

realizar operaes matemticas com os


endereos armazenados em ponteiros:
char* p;
char c[5];
p = &c[0]; // p recebe o endereo do 1o c
Ao incrementar o p, a linguagem C

identifica primeiramente qual o tipo


do ponteiro. Da, incrementa o endereo
que ele contm, de acordo com o tamanho
do seu tipo.
p++;

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

A2h
A3h

p
c[0]
c[1]
c[2]
c[3]
c[4]

Aritmtica de ponteiros
linguagem

Deste modo, voc pode fazer um programa que preenche o vetor sem ter que utilizar a varivel do vetor (varivel c):
void main(void) {
char* p;
char c[5];
p = c; // o mesmo que p = &c[0]
for(int cont=0;cont<5;cont++) {
*p = cont+1; // coloca cont+1 no local apontado por p
p++; // passa para o endereo do prximo elemento
}
}

OBS: o nome do vetor (sem o ndice)


contm o endereo do primeiro
elemento dele!
por isso que no scanf(%s, ...) no vai o &

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh

A6h
1
2
3
4
5

p
c[0]
c[1]
c[2]
c[3]
c[4]

Aritmtica de ponteiros
linguagem

Se a varivel c fosse um vetor de inteiros, o p seria incrementado de dois em dois bytes:


void main(void) {
int* p;
int c[5];
p = c; // o mesmo que p = &c[0]
for(int cont=0;cont<5;cont++) {
*p = cont+1; // coloca cont+1 no local apontado por p
p++; // passa para o endereo do prximo elemento
}
}

por esse motivo que os ponteiros devem

apontar para variveis que sejam de um tipo


igual ao seu. Caso contrrio, ao serem
incrementados ou decrementados, podem
acabar apontando para o local errado:
char* p2 = &c[0];
p2++;

Trecho de memria
A1h
A2h
A3h
A4h
A5h
A6h
A7h
A8h
A9h
AAh
ABh

AAh

c[0]

c[1]

c[2]

c[3]

c[4]

Resumo
linguagem

Operadores de ponteiros:

Operador

Uso

Exemplo

Declarao de ponteiro

char* p;

&

Retorna o endereo

p = &variavel;

Utilizao de contedo

char c = *p;

++

Incrementar o endereo

p++;

(aponta para o prximo elemento)

--

Decrementar o endereo
(aponta para o elemento anterior)

p--;

Neste tutorial voc...


linguagem

Aprendeu como as variveis so armazenadas na

memria do computador;
Descobriu como declarar ponteiros para armazenar
o endereo de outras variveis;
Aprendeu como um ponteiro pode ser utilizado
para manipular diretamente o contedo da memria
do computador (e, conseqentemente, o contedo
de outras variveis).
Para maiores informaes, visite a pgina da disciplina:
http://br.geocities.com/lwives