Teste seu entendimento sobre o operador &, o operador *, ponteiros NULL e a função swap.
int a = 42; int *p = &a; printf("%d\n", *p);
p guarda o endereço de a. *p desreferencia o ponteiro para ler o valor naquele endereço — o valor de a, que é 42.int a = 10; int *p = &a; *p = 20; printf("a = %d\n", a);
*p = 20 escreve 20 no local para o qual p aponta (que é a). O valor de a muda, então obtemos a = 20.int *p = NULL; printf("%d\n", *p);
*p) é comportamento indefinido.void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int main(void) { int x = 3, y = 7; swap(&x, &y); printf("x=%d, y=%d\n", x, y); return 0; }
*a = x e *b = y: tmp=3, *a=7, *b=3.int a[3] = {10, 20, 30}; int *p = a; printf("%d\n", p[1]);
a é tratado como um ponteiro para o primeiro elemento.
p = a faz p apontar para a[0]p[1] significa a mesma coisa que *(p + 1), que é igual a a[1] = 20[] também funcionar com ponteiros mostra o quão próximos são ponteiros e vetores.
int a[4] = {1, 2, 3, 4}; int *p = a; p++; printf("%d\n", *p);
++ a um ponteiro avança o endereço por o tamanho do tipo apontado.
p aponta para a[0] (=1)p++, p aponta para a[1] (avança sizeof(int) = 4 bytes)*p = a[1] = 2int* avança por sizeof(int); um char* avança 1 byte. Essa é a técnica fundamental para percorrer um vetor com ponteiros.
void safe_print(int *p) { if (p != NULL) { printf("%d\n", *p); } else { printf("NULL\n"); } } int main(void) { safe_print(NULL); return 0; }
p é NULL, a guarda if (p != NULL) impede que *p execute*p sem verificar NULL causaria segfault. Proteger com um if é um hábito essencial para escrever código C seguro.
int *danger(void) { int x = 42; return &x; // retorna o endereço de uma variável local } int main(void) { int *p = danger(); printf("%d\n", *p); return 0; }
x é liberada da pilha no momento em que a função retorna.
x já acabou quando o chamador o usa*p desreferencia um ponteiro solto — comportamento indefinidox como static, alocar dinamicamente com malloc, ou aceitar um buffer do chamador como argumento.
int x = 1, y = 2; int *p = &x; int *q = &y; p = q; *p = 99; printf("x=%d, y=%d\n", x, y);
p = q faz p apontar para o mesmo endereço que q (copia o ponteiro, não o valor apontado).
p = q, p aponta para y (não mais para x)*p = 99 escreve 99 em yx não é alterado e permanece 1p = q (atribuição de ponteiros) e *p = *q (cópia do valor apontado) — fazem coisas muito diferentes.