English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá sobre ponteiros. O que é um ponteiro, como usá-lo e os erros comuns que você pode encontrar ao usá-lo em exemplos.
Ponteiro é C e C ++ Um poderoso recurso da programação. Antes de aprender sobre ponteiros, vamos aprender sobre endereços na programação do C.
Se houver uma variável var no programa, &var fornecerá seu endereço na memória.
Quando usamos a função scanf(), já usamos endereços várias vezes.
scanf("%d", &var);
Aqui, o valor digitado pelo usuário é armazenado no endereço da variável var. Vamos dar um exemplo viável.
#include <stdio.h> int main() { int var = 5; printf("var: %d\n", var); // Atenção ao usar & antes do var printf("endereço do var: %p", &var); return 0; }
Resultados de saída
var: 5 var endereço: 2686778
Atenção:Ao executar o código acima, você pode obter outros endereços.
Ponteiro (variável ponteiro) é um tipo especial de variável usado para armazenar endereços em vez de valores.
Esta é a maneira como declaramos ponteiros.
int* p;
Aqui, já declaramos um ponteiro do tipo int p.
Você também pode declarar ponteiros da seguinte maneira.
int *p1; int * p2;
Vamos dar outro exemplo de declaração de ponteiro.
int* p1, p2;
Aqui, declaramos um ponteiro p1E uma variável comum p2.
Vamos dar um exemplo.
int* pc, c; c = 5; pc = &c;
Aqui, atribuímos5Atribuído ao variável c. E, o endereço de c é atribuído ao ponteiro pc.
Para obter o valor do conteúdo apontado pelo ponteiro, usamos o operador de desreferência (*Por exemplo:
int* pc, c; c = 5; pc = &c; printf("%d", *pc); // Saída: 5
Aqui, o endereço de c foi atribuído ao ponteiro pc. Para obter o valor armazenado nessa endereço, usamos*pc.
Vamos dar um exemplo.
int* pc, c; c = 5; pc = &c; c = 1; printf("%d", c); // Saída: 1 printf("%d", *pc); // Saída: 1
Já atribuímos o endereço de c ao ponteiro pc.
Então, alteramos o valor de c para1. Como o endereço de pc e c são os mesmos, então*pc obtém1.
Vamos dar outro exemplo.
int* pc, c; c = 5; pc = &c; *pc = 1; printf("%d", *pc); // Saída: 1 printf("%d", c); // Saída: 1
Já atribuímos o endereço de c ao ponteiro pc.
Então, usamos* pc = 1; Atribui* pc muda para1. Como o endereço de pc e c são os mesmos, então c é igual a1.
Vamos dar outro exemplo.
int* pc, c, d; c = 5; d = -15; pc = &c; printf("%d", *pc); // Saída: 5 pc = &d; printf("%d", *pc); // Saída: -15
No início, o endereço atribuído ao ponteiro pc = &c; porque c é5, então*pc nos5.
Então, use o endereço atribuído ao ponteiro pc = &d;. Como d é-15, então*pc nos-15.
Vamos dar um exemplo viável.
#include <stdio.h> int main() { int* pc, c; c = 22; printf("Endereço de c: %p\n", &c); printf("Valor de c: %d\n\n", c); // 22 pc = &c; printf("Endereço do ponteiro pc: %p\n", pc); printf("Conteúdo do ponteiro pc: %d\n\n", *pc); // 22 c = 11; printf("Endereço do ponteiro pc: %p\n", pc); printf("Conteúdo do ponteiro pc: %d\n\n", *pc); // 11 *pc = 2; printf("Endereço de c: %p\n", &c); printf("Valor de c: %d\n\n", c); // 2 return 0; }
Resultados de saída
Endereço de c: 003FFBF8 Valor de c: 22 Endereço do ponteiro pc: 003FFBF8 Conteúdo do ponteiro pc: 22 Endereço do ponteiro pc: 003FFBF8 Conteúdo do ponteiro pc: 11 Endereço de c: 003FFBF8 Valor de c: 2
Uso do programa
int* pc, c;
Aqui foi criado um ponteiro pc e um variável comum c, ambos do tipo int. Como pc e c não foram inicializados no início, o ponteiro pc aponta para um endereço sem valor ou um endereço aleatório. O variável c tem um endereço, mas contém valores lixo aleatórios.
c = 22;
Isso é atribuir um valor ao variável c22, ou seja,22é armazenado na memória do variável c.
pc = &c;
Isso atribui o endereço do variável c ao ponteiro pc.
c = 11;
Isso11atribuído ao variável c.
*pc = 2;
Isso alterará o valor da posição de memória apontada pelo ponteiro pc2.
Suponha que você deseje que o ponteiro pc aponte para o endereço de c. Então,
int c, *pc; //pc é um endereço, mas c não é pc = c; // Erro //&c é um endereço, mas* pc não é *pc = &c; // Erro //&c e pc são endereços pc = &c; //c e*pc valor *pc = c;
Este é um exemplo que os iniciantes na sintaxe de ponteiros frequentemente acham confuso.
#include <stdio.h> int main() { int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; }
Por que não apareceu erro ao usar int *p = &c;?
porque
int *p = &c;
equivalente a
int *p: p = &c;
Nesses dois casos, criamos um ponteiro p (não*p) e atribuí-lo &c.
Para evitar essa confusão, podemos usar a seguinte instrução:
int* p = &c;
Agora você sabe o que é um ponteiro, você aprenderá no próximo tutorial o relacionamento entre ponteiros e arrays.