Ponteiros C (com exemplos)

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, &varfornecerá 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 inttipo.

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, *pcnos 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 *pcpara 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, *pcnos dá 5.

Em seguida, o endereço de d é atribuído ao ponteiro do pc usando pc = &d;. Como d é -15, *pcnos 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

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, 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.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *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 &ca 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.

Artigos interessantes...