Neste tutorial, você aprenderá sobre ponteiros; o que são ponteiros, como usá-los e os erros comuns que você pode enfrentar ao trabalhar com eles com a ajuda de exemplos.
Ponteiros são recursos poderosos de programação C e C ++. Antes de aprendermos os ponteiros, vamos aprender sobre os endereços na 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.
Usamos o endereço várias vezes ao usar a scanf()
função.
scanf("%d", &var);
Aqui, o valor inserido pelo usuário é armazenado no endereço da variável var. Vamos dar um exemplo prático.
#include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; )
Resultado
var: 5 endereço de var: 2686778
Observação: você provavelmente obterá um endereço diferente ao executar o código acima.
Ponteiros C
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.
int* p;
Aqui, declaramos um ponteiro p do int
tipo.
Você também pode declarar ponteiros dessas maneiras.
int *p1; int * p2;
Vamos dar outro exemplo de declaração de ponteiros.
int* p1, p2;
Aqui, declaramos um ponteiro p1 e uma variável normal p2.
Atribuição de endereços a ponteiros
Vamos dar um exemplo.
int* pc, c; c = 5; pc = &c;
Aqui, 5 é atribuído à variável c. E, o endereço de c é atribuído ao ponteiro do pc.
Obtenha o valor das coisas apontadas por indicadores
Para obter o valor da coisa apontada pelos ponteiros, usamos o *
operador. Por exemplo:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Output: 5
Aqui, o endereço de c
é atribuído ao ponteiro do PC. Para obter o valor armazenado nesse endereço, usamos * pc.
Observação: no exemplo acima, pc é um ponteiro, não *pc
. Você não pode e não deve fazer algo semelhante *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.
Alteração do valor apontado por ponteiros
Vamos dar um exemplo.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Output: 1 printf("%d", *pc); // Ouptut: 1
Atribuímos o endereço de c ao ponteiro do pc.
Então, alteramos o valor de c para 1. Como pc e o endereço de c são iguais, *pc
nos dá 1.
Vamos dar outro exemplo.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Ouptut: 1 printf("%d", c); // Output: 1
Atribuímos o endereço de c ao ponteiro do pc.
Então, mudamos *pc
para 1 usando *pc = 1;
. Como pc e o endereço de c são iguais, c será igual a 1.
Vamos dar mais um exemplo.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Output: 5 pc = &d; printf("%d", *pc); // Ouptut: -15
Inicialmente, o endereço de c é atribuído ao ponteiro do pc usando pc = &c;
. Como c é 5, *pc
nos dá 5.
Em seguida, 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
Vamos dar um exemplo prático.
#include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; )
Resultado
Endereço de c: 2686784 Valor de c: 22 Endereço do ponteiro pc: 2686784 Conteúdo do ponteiro pc: 22 Endereço do ponteiro pc: 2686784 Conteúdo do ponteiro pc: 11 Endereço de c: 2686784 Valor de c: 2
Explicação do programa
int* pc, c;
Here, a pointer pc and a normal variable c, both of typeint
, is created.
Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.c = 22;
This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.pc = &c;
This assigns the address of variable c to the pointer pc.c = 11;
This assigns 11 to variable c.*pc = 2;
This change the value at the memory location pointed by the pointer pc to 2.
Common mistakes when working with pointers
Suppose, you want pointer pc to point to the address of c. Then,
int c, *pc; // pc is address but c is not pc = c; // Error // &c is address but *pc is not *pc = &c; // Error // both &c and pc are addresses pc = &c; // both c and *pc values *pc = c;
Here's an example of pointer syntax beginners often find confusing.
#include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )
Why didn't we get an error when using int *p = &c;
?
It's because
int *p = &c;
is equivalent to
int *p: p = &c;
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 declaração assim:
int* p = &c;
Agora que você sabe o que são ponteiros, aprenderá como ponteiros estão relacionados a arrays no próximo tutorial.