Você está na página 1de 5

Bases de Programação 12o TI

Ana Paula Castel-Branco


31 de Janeiro de 2007

Ponteiros

1. Aritmética de Ponteiros

Quando utilizamos ponteiros com arrays temos de falar em aritmética de ponteiros. Tem
a ver com o facto de podermos efectuar algumas operações aritméticas com os ponteiros (e com
os endereços por eles contidos).

Em C++ existem quatro operadores aitméticos que podem ser usados com ponteiros:

• operador de adição: +;

• operador de subtracção: -;

• operador de incremento: ++;

• operador de decrement: - -.

Sendo p um ponteiro, consideremos *(p+1) que significa que ao endereço contido por p é
adicionada uma unidade de endereço.

Isto quer dizer que *(p+1) aponta para o endereço seguinte ao endereço apontado por p,
tendo em conta o tipo de dados que está a ser apontado: int, float, char, etc.

Nota: os diferentes tipos de dados podem ocupar diferentes quntidades de memória em bytes,
por exemplo: em p+1 o +1 pode reperesentar: 1 byte; 2 bytes; 4 bytes, etc., consoante o tipo de
dados.

1
1.1. Consideremos o seguinte programa

• A instrução: int * p = x; declara o ponteiro p e é-lhe atribuído o endereço do array x.


• A instrução: cout « p; faz escrever o endereço do primeiro elemento do array x (o mesmo
endereço de &x[0]).
• A instrução: cout « p + 1; faz escrever o endereço do segundo elemento do array x (o
mesmo endereço de &x[1]).
O que quer dizer que o endereço do ponteiro p adicionado de uma unidade (p + 1) aponta
para o endereço seguinte do array de inteiros x, ou seja, para &x[1].

1.2. Consideremos agora uma outra versão do programa

Neste caso,

2
• A expressão ++p faz o incremento do endereço do ponteiro p. Donde a instrução
cout«++p escreve o endereço seguinte ao de p.
• Com a instrução: cout « p++; em primeiro lugar é esrito o endereço corrente do ponteiro
p e só depois é que é feito o seu incremento.

Acabamos de ver como funciona a aritmética de ponteiros no que diz respeito aos endereços
que eles contêm ou para que apontam.

Representação esquemática em memóia RAM de um array x e de um ponteiro p:

Vejamos agora como funciona a aritmética de ponteiros com o operador de indirecção (*),
ou seja quanto às variáveis apontadas.

1.3. Consideremos o seguinte programa

Com a declaração int * p = x criamos o ponteiro p e colocamos nele o endereço do array x.

3
• A instrução: cout « *p; faz screver 10, isto porque *p indica indirectamente o valor
contido no primeiro elemento de x.

• A instrução: cout « *(p+1); faz screver 11, isto porque *(p+1) aponta o valor contido
no segundo elemento do array x; no entanto, *p continua com o endereço anterior.

• A instrução: cout « *p++); faz screver 10, que é o valor apontado no momento por p
(que continua a ser o do primeiro elemento do array x); no entanto, com p++, p passa a
apontar para o segundo elemento de x.

2. Ponteiros e Strings

Como já vimos anteriomente (quado falamos de Strings como arrays de char), podemos definir
uma string s) da seguinte forma:

char s[ ] = "Hello";

Podemos representar da seguinte forma:

Podemos obter o mesmo resultado da declaração anterior com:

char *s = "Hello";

Enquando que na primeira decalração a variável s é declarada como um array de char, na


segunda declaração, a variável s é declarada como um ponteiro para char.

Quer de uma maneira ou de outra, como s é inicializada na sua declaração, em termos de


memória, o efeito é o mesmo.

4
Consideremos os dois programas que se seguem, em que exemplifica o que se acabou de dizer:

Em qualquer dos casos utilizamos a função cout para escrever a string s por inteiro.

Se pretendermos escrever a string s caracter a caracter, isto é, percorrendo os seus elementos


um a um, teremos que fazer da seguinte maneira,

Referências
[1] Azul, Artur Augusto, "Bases de Programação 12", Curso Tecnológico de Informática - 12o ano, Porto
Editora, Porto, 2006.