C ++ Pointer Arithmetic
Como você entendeu, o ponteiro é um endereço que é um valor numérico; portanto, você pode realizar operações aritméticas em um ponteiro da mesma forma que faz com um valor numérico. Existem quatro operadores aritméticos que podem ser usados em ponteiros: ++, -, + e -
Para entender a aritmética de ponteiros, vamos considerar que ptr é um ponteiro inteiro que aponta para o endereço 1000. Assumindo números inteiros de 32 bits, vamos realizar a seguinte operação aritmética no ponteiro -
ptr++
a ptrirá apontar para a localização 1004 porque cada vez que ptr é incrementado, ele irá apontar para o próximo inteiro. Esta operação moverá o ponteiro para o próximo local da memória sem afetar o valor real no local da memória. Se ptr apontar para um caractere cujo endereço é 1000, a operação acima apontará para o local 1001 porque o próximo caractere estará disponível em 1001.
Incrementando um Ponteiro
Preferimos usar um ponteiro em nosso programa em vez de um array porque o ponteiro variável pode ser incrementado, ao contrário do nome do array que não pode ser incrementado porque é um ponteiro constante. O programa a seguir incrementa o ponteiro variável para acessar cada elemento sucessivo da matriz -
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the next location
ptr++;
}
return 0;
}
Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
Decrementando um Ponteiro
As mesmas considerações se aplicam à diminuição de um ponteiro, o que diminui seu valor pelo número de bytes de seu tipo de dados, conforme mostrado abaixo -
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have address of the last element in pointer.
ptr = &var[MAX-1];
for (int i = MAX; i > 0; i--) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the previous location
ptr--;
}
return 0;
}
Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -
Address of var[3] = 0xbfdb70f8
Value of var[3] = 200
Address of var[2] = 0xbfdb70f4
Value of var[2] = 100
Address of var[1] = 0xbfdb70f0
Value of var[1] = 10
Comparações de Ponteiros
Os ponteiros podem ser comparados usando operadores relacionais, como ==, <e>. Se p1 e p2 apontam para variáveis que estão relacionadas entre si, como elementos da mesma matriz, então p1 e p2 podem ser comparados de forma significativa.
O programa a seguir modifica o exemplo anterior incrementando o ponteiro da variável, desde que o endereço para o qual ele aponta seja menor ou igual ao endereço do último elemento da matriz, que é & var [MAX - 1] -
#include <iostream>
using namespace std;
const int MAX = 3;
int main () {
int var[MAX] = {10, 100, 200};
int *ptr;
// let us have address of the first element in pointer.
ptr = var;
int i = 0;
while ( ptr <= &var[MAX - 1] ) {
cout << "Address of var[" << i << "] = ";
cout << ptr << endl;
cout << "Value of var[" << i << "] = ";
cout << *ptr << endl;
// point to the previous location
ptr++;
i++;
}
return 0;
}
Quando o código acima é compilado e executado, ele produz um resultado como o seguinte -
Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200