C Memória Básico
Ponteiros
Um ponteiro é uma variável que guarda um endereço de memória. Em vez de armazenar um valor como int x = 10, um ponteiro como int *p armazena onde esse valor está. O operador & obtém o endereço de uma variável, e o operador * (desreferência) acessa o valor guardado naquele endereço.
Ponteiros são a base de arrays em C: o nome de um array "decai" para um ponteiro para o primeiro elemento. Por isso v[i] é equivalente a *(v + i). Essa equivalência abre espaço para a aritmética de ponteiros, em que somar 1 a um ponteiro avança para o próximo elemento do tipo apontado, não para o próximo byte.
Um ponteiro que não aponta para lugar nenhum deve ser nulo (NULL). Desreferenciar um ponteiro nulo é comportamento indefinido e geralmente causa falha de segmentação. Sempre inicialize ponteiros e verifique if (p != NULL) antes de usá-los.
Pontos-chave
&xdevolve o endereço dex;*pacessa o valor no endereço guardado emp.- Um ponteiro nulo (
NULL) não aponta para nada e não deve ser desreferenciado. - O nome de um array decai para um ponteiro para seu primeiro elemento.
v[i]é equivalente a*(v + i); a aritmética avança em elementos, não em bytes.p + 1andasizeof(*p)bytes na memória.
#include <stdio.h>
int main(void) {
int x = 42;
int *p = &x; /* p guarda o endereco de x */
printf("x = %d\n", x);
printf("*p = %d\n", *p); /* desreferencia: le o valor em x */
*p = 100; /* altera x atraves do ponteiro */
printf("x apos *p = 100: %d\n", x);
int v[4] = {10, 20, 30, 40};
int *q = v; /* v decai para &v[0] */
for (int i = 0; i < 4; i++) {
/* *(q + i) e o mesmo que v[i] */
printf("v[%d] = %d\n", i, *(q + i));
}
int *nulo = NULL;
if (nulo == NULL) {
printf("ponteiro nulo: nao pode ser desreferenciado\n");
}
return 0;
}