Usar Apontador Amperímetro e Notação em C

Jinku Hu 12 outubro 2023
  1. Utilizar a notação &var para obter o endereço de uma dada variável
  2. Utilize a notação *ptr para aceder ao valor da variável a partir do ponteiro
  3. Utilize a notação Ampersand & para passar o endereço dos objectos para as funções
Usar Apontador Amperímetro e Notação em C

Este artigo introduzirá múltiplos métodos sobre como utilizar os amperes e notação do ponteiro em C.

Utilizar a notação &var para obter o endereço de uma dada variável

Os apontadores são simplesmente variáveis que contêm os endereços da memória. São declarados com a notação type *var. Ao ponteiro pode ser atribuído qualquer endereço do mesmo tipo, e qualquer tipo de ponteiro pode armazenar o ponteiro void*, que é chamado de ponteiro genérico. Uma vez que temos um tipo que armazena os endereços dos objectos, deve haver um operador que forneça acesso a um.

O símbolo de amperes e & é utilizado como um operador unário frequentemente referido como o operador de address-of. Pode ser utilizado em objectos de dados e funções para recuperar o endereço no qual o objecto é armazenado.

Suponha que temos um número inteiro x declarado e inicializado como se mostra no exemplo seguinte. Nesse caso, podemos tomar o seu endereço com o operador de ampersand & e atribuí-lo à variável int *xptr. Como resultado, xptr aponta para o valor de 10233, e o operador * pode ser utilizado para aceder ao seu valor no código subsequente.

Note-se que o asterisco * é aqui utilizado em dois contextos diferentes. Um é para declarar uma variável do tipo ponteiro. O outro é para aceder ao valor do ponteiro para a variável, a última das quais é chamada de desreferenciação.

#include <stdio.h>
#include <stdlib.h>

int main() {
  int x = 10233;
  int *xptr = &x;  // xptr now points to x

  printf("x: %d\n", x);
  printf("*xptr: %d\n", *xptr);

  exit(EXIT_SUCCESS);
}

Resultado:

x: 10233
*xptr: 10233

Utilize a notação *ptr para aceder ao valor da variável a partir do ponteiro

O operador de desreferenciação pode ser utilizado para recuperar valores das indicações e atribuí-los a variáveis do mesmo tipo. Note-se que, * o operador não pode ser utilizado com apontadores null ou inválidos porque resulta num comportamento indefinido. Na maioria dos cenários, se se tentar o ponteiro null, é provável que o programa falhe. Mas se o ponteiro inválido for acedido, pode passar despercebido. Um ponteiro inválido pode apontar para algum objecto arbitrário na memória, e as operações sobre ele continuarão, mas pode danificar a correcção do estado do programa.

#include <stdio.h>
#include <stdlib.h>

int main() {
  int x = 10233;
  int *xptr = &x;  // xptr now points to x

  int y = *xptr;  // y now holds the value 10233
  printf("x: %d\n", x);
  printf("y: %d\n", y);

  exit(EXIT_SUCCESS);
}

Resultado:

x: 10233
y: 10233

Utilize a notação Ampersand & para passar o endereço dos objectos para as funções

O exemplo mais comum de utilização dos destinatários do operador é passar um ponteiro para o objecto como argumento de função. O exemplo seguinte demonstra a função swap que toma dois apontadores inteiros como argumentos. Note-se que quando o swap é chamado a partir da função main, o operador de ampersand é utilizado para passar os endereços das variáveis x e y. No entanto, o operador * no corpo da função swap denota o desreferenciamento do ponteiro.

#include <stdio.h>
#include <stdlib.h>

void swap(int *x, int *y) {
  int tmp = *x;
  *x = *y;
  *y = tmp;
}

int main() {
  int x = 10233;
  int y = 10133;

  printf("x:%d, y:%d\n", x, y);
  swap(&x, &y);
  printf("x:%d, y:%d\n", x, y);

  exit(EXIT_SUCCESS);
}

Resultado:

x:10233, y:10133
x:10133, y:10233
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Pointer