Os ponteiros são recursos poderosos da programação C e C ++. Antes de aprendermos os ponteiros, vamos aprender sobre endereços em programação C.
Endereço em C
Se você tiver uma variável var em seu programa, &var
fornecerá seu endereço na memória.
Nós usamos o endereço várias vezes enquanto usamos a função scanf()
.
Aqui, o valor inserido pelo usuário é armazenado no endereço da variável var. Vejamos um exemplo prático.
Saída
var: 5 address of var: 2686778
Observação: você provavelmente obterá um endereço diferente ao executar o código acima.
C Ponteiros
Ponteiros (variáveis de ponteiro) são variáveis especiais usadas para armazenar endereços em vez de valores.
Sintaxe de ponteiro
Aqui está como podemos declarar ponteiros.
Aqui, declaramos um ponteiro p do tipo int
.
Você também pode declarar ponteiros dessas maneiras.
Vejamos outro exemplo de declaração de ponteiros.
Aqui, declaramos um ponteiro p1 e uma variável normal p2.
Atribuição de endereços a ponteiros
Vejamos um exemplo.
Aqui, 5 é atribuído à variável c. E, o endereço de c é atribuído ao ponteiro pc.
Obter valor da coisa apontada por ponteiros
Para obter o valor da coisa apontada pelos ponteiros, usamos o *
operador. Por exemplo:
Aqui, o endereço de c
é atribuído ao ponteiro do pc. Para obter o valor armazenado nesse endereço, usamos * pc.
Nota: No exemplo acima, pc é um ponteiro, não *pc
. Você não pode e não deve fazer algo como *pc = &c
;
A propósito, *
é chamado de operador de desreferência ( ao trabalhar com ponteiros). Ele opera em um ponteiro e fornece o valor armazenado nesse ponteiro.
Alterando o valor apontado por ponteiros
Vejamos um exemplo.
Atribuímos o endereço de c ao ponteiro de pc.
Em seguida, alteramos o valor de c para 1. Como pc e o endereço de c é o mesmo, *pc
nos dá 1.
Vejamos outro exemplo.
Atribuímos o endereço de c ao ponteiro do pc.
Em seguida, alteramos *pc
para 1 usando *pc = 1;
. Como pc e o endereço de c são iguais, c será igual a 1.
Vejamos mais um exemplo.
Inicialmente, o endereço de c é atribuído ao ponteiro do pc usando pc = &c;
. Como c é 5, *pc
nos dá 5.
Então, o endereço de d é atribuído ao ponteiro do pc usando pc = &d;
. Como d é -15, *pc
nos dá -15 .
Exemplo: Trabalho de ponteiros
Vejamos um exemplo prático.
Resultado
Address of c: 2686784Value of c: 22Address of pointer pc: 2686784Content of pointer pc: 22Address of pointer pc: 2686784Content of pointer pc: 11Address of c: 2686784Value of c: 2
Explicação do programa
-
int* pc, c;
Aqui , um ponteiro pc e uma variável normal c, ambos do tipoint
, são criados.
Como pc e c não são inicializados inicialmente, o ponteiro pc aponta para nenhum endereço ou um endereço aleatório. E a variável c tem um endereço, mas contém um valor de lixo aleatório. -
c = 22;
Isso atribui 22 à variável c. Ou seja, 22 é armazenado na localização da memória da variável c. -
pc = &c;
Isso atribui o endereço da variável c ao ponteiro pc. -
c = 11;
Isso atribui 11 à variável c. -
*pc = 2;
Isso altera o valor no local da memória apontado pelo ponteiro pc para 2.
Erros comuns ao trabalhar com ponteiros
Suponha que você queira que o ponteiro pc aponte para o endereço de c. Então,
Aqui está um exemplo de sintaxe de ponteiro que os iniciantes costumam achar confusa.
Por que não recebemos um erro quando usando int *p = &c;
?
É porque
é equivalente a
Em ambos os casos, estamos criando um ponteiro p
(não *p
) e atribuindo &c
a ele.
Para evitar essa confusão, podemos usar a instrução como esta:
Agora que você sabe o que são os ponteiros, aprenderá como ponteiros estão relacionados a matrizes no próximo tutorial.