Ponteiros C
Ponteiros C
Neste tutorial, você aprenderá sobre ponteiros; o que são ponteiros, como você os usa e os erros comuns que você pode enfrentar ao trabalhar com eles com a ajuda de exemplos.
Ponteiros são recursos poderosos da programação C e C++. Antes de aprendermos sobre ponteiros, vamos aprender sobre endereços na programação C.
Endereço em C
Se você tiver uma variável var em seu programa,
&var
lhe dará seu endereço na memória. Usamos o endereço várias vezes ao usar o
scanf()
função.
scanf("%d", &var);
Aqui, o valor inserido pelo usuário é armazenado no endereço de var variável. Vamos dar um exemplo de trabalho.
#include <stdio.h>
int main()
{
int var = 5;
printf("var: %d\n", var);
// Notice the use of & before var
printf("address of var: %p", &var);
return 0;
}
Saída
var: 5 address of 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 que são usadas para armazenar endereços em vez de valores.
Sintaxe do ponteiro
Aqui está como podemos declarar ponteiros.
int* p;
Aqui, declaramos um ponteiro p de
int
modelo. 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 .
Atribuindo endereços a ponteiros
Vamos dar um exemplo.
int* pc, c;
c = 5;
pc = &c;
Aqui, 5 é atribuído ao c variável. E o endereço de c é atribuído ao pc ponteiro.
Obter valor da coisa apontada por ponteiros
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 pc ponteiro. 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 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
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 para o computador ponteiro.
Em seguida, alteramos o valor de c para 1. Desde pc e o endereço de c é o mesmo,
*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 para o computador ponteiro.
Em seguida, alteramos
*pc
para 1 usando *pc = 1;
. Desde computador e o endereço de c é o mesmo, 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 pc ponteiro usando
pc = &c;
. Desde c é 5, *pc
nos dá 5. Em seguida, o endereço de d é atribuído ao pc ponteiro usando
pc = &d;
. Desde d é -15, *pc
nos dá -15. Exemplo:trabalho de ponteiros
Vamos dar um exemplo de trabalho.
#include <stdio.h>
int main()
{
int* pc, c;
c = 22;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 22
pc = &c;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 22
c = 11;
printf("Address of pointer pc: %p\n", pc);
printf("Content of pointer pc: %d\n\n", *pc); // 11
*pc = 2;
printf("Address of c: %p\n", &c);
printf("Value of c: %d\n\n", c); // 2
return 0;
}
Saída
Address of c: 2686784 Value of c: 22 Address of pointer pc: 2686784 Content of pointer pc: 22 Address of pointer pc: 2686784 Content of pointer pc: 11 Address of c: 2686784 Value of c: 2
Explicação do programa
int* pc, c;
Aqui, um ponteiro pc e uma variável normal c , ambos do tipoint
, é criado.
Desde computador e c não são inicializados inicialmente, ponteiro pc aponta para nenhum endereço ou para um endereço aleatório. E, 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 no local de memória da variável c .
pc = &c;
Isso atribui o endereço da variável c para o ponteiro pc .
c = 11;
Isso atribui 11 à variável c .
*pc = 2;
Isso altera o valor no local de memória apontado pelo ponteiro pc para 2.
Erros comuns ao trabalhar com ponteiros
Suponha que você queira o ponteiro pc para apontar para o endereço de c . Então,
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; // Not an error
// both c and *pc values
*pc = c; // Not an error
Aqui está um exemplo de sintaxe de ponteiro que os iniciantes costumam achar confuso.
#include <stdio.h>
int main() {
int c = 5;
int *p = &c;
printf("%d", *p); // 5
return 0;
}
Por que não recebemos um erro ao usar
int *p = &c;
? É porque
int *p = &c;
é equivalente a
int *p:
p = &c;
Em ambos os casos, estamos criando um ponteiro
p
(não *p
) e atribuindo &c
para isso. Para evitar essa confusão, podemos usar a declaração assim:
int* p = &c;
Agora que você sabe o que são ponteiros, você aprenderá como ponteiros estão relacionados a arrays no próximo tutorial.
Linguagem C
- C# Hello World - Seu primeiro programa em C#
- Palavras-chave e identificadores C#
- Variáveis C# e tipos de dados (primitivos)
- Operadores C#
- Operadores C# Bitwise e Bit Shift
- Entrada e saída básica em C#
- Expressões, instruções e blocos em C# (com exemplos)
- Comentários em C#
- Ponteiros C
- Relação entre arrays e ponteiros