Aritmética de ponteiros em C refere-se às operações matemáticas que podem ser realizadas em ponteiros para acessar diferentes posições de memória. Essas operações são particularmente úteis quando se trabalha com arrays, estruturas de dados e alocação dinâmica de memória. No entanto, a aritmética de ponteiros requer cuidado para evitar acessos indevidos à memória e comportamento indefinido.
A aritmética de ponteiros depende do tipo base do ponteiro sendo possível apenas a utilização de adição e subtração, sem multiplicações e divisões.
Cada vez que um ponteiro é incrementado, ele aponta para a posição de memória do próximo elemento do seu tipo base e cada vez que for decrementado, aponta para a posição anterior:
++p; //Pré-incrementa o valor do ponteiro;
--p; //Pré-decrementa o valor do ponteiro;
p++; //Pós-incrementa o valor do ponteiro;
p--; //Pós-decrementa o valor do ponteiro;
p+i; //Soma de um ponteiro com um inteiro;
p-i; //Subtração de um inteiro sobre o ponteiro;
Em C, as operações básicas de aritmética de ponteiros são:
Incremento e Decremento:
int array[5] = {10, 20, 30, 40, 50};
int *ponteiro = array;
ponteiro++; // move para o próximo elemento do array
Adição e Subtração:
int *ponteiro = &array[2];
ponteiro = ponteiro + 2; // move dois elementos à frente
Diferença entre Ponteiros:
int *ponteiro1 = &array[1];
int *ponteiro2 = &array[4];
int diferenca = ponteiro2 - ponteiro1; // diferença é 3 posições
Acesso a Elementos de Arrays:
int *ponteiro = array;
int valor = *(ponteiro + 3); // acessa o quarto elemento (40)
É importante ter em mente algumas considerações ao usar a aritmética de ponteiros:
void
. Neste caso, a variável ponteiro contém um endereço genérico, sobre um tipo que não pode ser determinado. Portanto, operações aritméticas sobre este tipo de ponteiro não são permitidas;Exemplificação visual
Exemplo 01
Exemplo 02
Exemplo 03
Em C, as operações lógicas aplicadas diretamente a ponteiros são limitadas. Os ponteiros são geralmente usados para lidar com endereços de memória e para realizar operações lógicas envolvendo ponteiros, você deve considerar principalmente comparações de igualdade ou diferença. Aqui estão algumas das operações lógicas de ponteiros mais comuns:
Comparação de Igualdade (==
):
int *ponteiro1, *ponteiro2;
if (ponteiro1 == ponteiro2) {
// Ponteiros apontam para a mesma posição de memória
}
Comparação de Diferença (!=
):
int *ponteiro1, *ponteiro2;
if (ponteiro1 != ponteiro2) {
// Ponteiros apontam para posições diferentes de memória
}
Lembre-se de que as operações lógicas em ponteiros não fazem comparações sobre os valores armazenados nas posições de memória para as quais os ponteiros apontam. Eles comparam apenas os endereços de memória.
Além das operações lógicas diretas, é importante ter em mente que ponteiros podem ser usados com condicionais e loops, onde suas comparações e operações lógicas podem ser aplicadas para controlar o fluxo do programa ou para avaliar determinadas condições.
Exemplo 04
Exemplo 05
int strlen_pointers(char *str) { char *s = str; while( *s != '\0' ) s++; return ( s - str ); }
int strlen_arrays( char s[] ) { int i = 0; while( s[i] != '\0' ) i++; return ( i ); }