Usar Apontador Amperímetro e Notação em C
-
Utilizar a notação
&var
para obter o endereço de uma dada variável -
Utilize a notação
*ptr
para aceder ao valor da variável a partir do ponteiro -
Utilize a notação Ampersand
&
para passar o endereço dos objectos para as funções
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
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