Ponteiros - Parte 1
Até aqui, declaramos variáveis sem nos importamos com os endereços de memória que armazenam os valores informados por nós. A partir de agora, entenderemos como podemos consultar esses endereços.
📍 Consultando endereços de memória
Na linguagem de programação C, podemos utilizar o operador de endereço (representado por &
) antes do nome da variável, para obter o seu endereço de memória. Vejamos o exemplo:
#include<stdio.h>
#include<stdlib.h>
int main(void){
int a = 10;
printf("%d", a); // imprime o valor de A
printf("%d", &a); // imprime o endereço de memória de A
return 0;
}
♐ Criando uma variável que aponta para outra
No exemplo anterior, estávamos apenas imprimindo o valor do endereço de memória da variável a
. Podemos criar uma segunda variável, chamada de ponteiro (ou apontador), para armazenar o endereço de memória de a
:
int a = 10;
int *aPtr;
aPtr = &a;
Poderíamos também reduzir o código acima, declarando tudo em uma linha apenas:
int a = 10;
int *aPtr = &a;
Para entendermos melhor o que acontece, podemos imprimir os valores:
printf("%p\n", &a);
printf("%p\n", aPtr);
- o primeiro
printf
imprime diretamente o endereço de memória da variável a
. - o segundo
printf
, por sua vez, imprime o valor da variável `aPtr`, que armazena o endereço de memória da variável a
.
🐣 Inicialização dos ponteiros
Como já compreendemos até aqui, uma variável do tipo ponteiro aponta para uma posição de memória. A simples declaração de um ponteiro, sem a atribuição de um valor (como no exemplo abaixo), não apresenta nenhuma utilidade:
int *x;
Como ressaltado por André Backes (2018), "ponteiros não inicializados apontam para um lugar indefinido", como é o caso do fragmento de código acima. Se usarmos esse ponteiro em seu estágio atual, não saberemos com exatidão qual será o resultado no programa. Pode ser que a variável x
aponte para uma posição indefinida de memória ou, ainda, aponte para uma região de memória utilizada por outra variável do programa.
NULL
.Essa constante, que é equivalente a 0 em muitos compiladores, é fornecida pela biblioteca stdlib.h
.
NULL
pode equivaler a 0
, por que não utilizar 0
direto? Simples: para não confundir um valor inexistente, representado com NULL
, de 0
. Se a nota do estudante é NULL
, entendemos que ela ainda não foi calculada ou atribuída. Se ela for 0, entendemos que ele obteve essa nota.🔢 Manipulando valores
A vantagem do uso de ponteiros está em utilizar o endereço de memória de uma variável para poder alterar o seu valor. Para isso, precisamos usar o operador de indireção
, representado por *
O operador de indireção funciona com a seguinte lógica:
*aPtr = 25;
aPtr
é um ponteiro, ou seja, armazena o endereço de memória de outra variável (no nosso exemplo, o endereço de memória da variável a
).
*
faz referência ao conteúdo do endereço de memória armazenado pelo ponteiro.
aPtr
e, naquela posição de memória, insira o valor 25
.