English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico do C

Controle de fluxo de linguagem C

Funções no C

Matrizes no C

Ponteiros no C

Strings no C

Estrutura de linguagem C

Arquivo de linguagem C

Outros C

Manual de referência do C

Ponteiros no C

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.

Endereç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.

Ponteiros no C

Ponteiro (variável ponteiro) é um tipo especial de variável usado para armazenar endereços em vez de valores.

Sintaxe de ponteiros

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.

Atribuir endereço ao ponteiro

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.

Obter o valor apontado pelo ponteiro

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.

Mudar o valor apontado pelo ponteiro

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.

Exemplo: como funcionam os ponteiros

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

  1. 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.  

  2. c = 22;

    Isso é atribuir um valor ao variável c22, ou seja,22é armazenado na memória do variável c.
     

  3. pc = &c;

    Isso atribui o endereço do variável c ao ponteiro pc.
     

  4. c = 11;

    Isso11atribuído ao variável c.
     

  5. *pc = 2;

    Isso alterará o valor da posição de memória apontada pelo ponteiro pc2.

Erros comuns ao usar ponteiros

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.