Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

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
  1. int* pc, c;

    Aqui, um ponteiro pc e uma variável normal c , ambos do tipo int , é 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.
  2. c = 22;

    Isso atribui 22 à variável c . Ou seja, 22 é armazenado no local de memória da variável c .
  3. pc = &c;

    Isso atribui o endereço da variável c para o ponteiro pc .
  4. c = 11;

    Isso atribui 11 à variável c .
  5. *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

  1. C# Hello World - Seu primeiro programa em C#
  2. Palavras-chave e identificadores C#
  3. Variáveis ​​C# e tipos de dados (primitivos)
  4. Operadores C#
  5. Operadores C# Bitwise e Bit Shift
  6. Entrada e saída básica em C#
  7. Expressões, instruções e blocos em C# (com exemplos)
  8. Comentários em C#
  9. Ponteiros C
  10. Relação entre arrays e ponteiros