Ponteiros em programação C com exemplos
Um ponteiro é uma variável que armazena o endereço de outra variável. Ao contrário de outras variáveis que armazenam valores de um certo tipo, o ponteiro mantém o endereço de uma variável. Por exemplo, uma variável inteira contém (ou você pode dizer armazena) um valor inteiro, no entanto, um ponteiro inteiro contém o endereço de uma variável inteira. Neste guia, discutiremos ponteiros em programação C com a ajuda de exemplos.
Antes de discutirmos sobre ponteiros em C, vamos dar um exemplo simples para entender o que queremos dizer com o endereço de uma variável.
Um exemplo simples para entender como acessar o endereço de uma variável sem ponteiros?
Neste programa, temos uma variável num do tipo int. O valor de num é 10 e esse valor deve ser armazenado em algum lugar da memória, certo? Um espaço de memória é alocado para cada variável que contém o valor daquela variável, este espaço de memória tem um endereço. Por exemplo, moramos em uma casa e nossa casa tem um endereço, o que ajuda outras pessoas a encontrarem nossa casa. Da mesma forma que o valor da variável é armazenado em um endereço de memória, o que ajuda o programa C a encontrar esse valor quando for necessário.
Então, digamos que o endereço atribuído à variável num seja 0x7fff5694dc58
, o que significa que qualquer valor que atribuiríamos a num deve ser armazenado no local: 0x7fff5694dc58
. Veja o diagrama abaixo.
Resultado:
Value of variable num is: 10Address of variable num is: 0x7fff5694dc58
Um exemplo simples de ponteiros em C
Este programa mostra como um ponteiro é declarado e usado. Existem várias outras coisas que podemos fazer com os ponteiros; nós as discutimos posteriormente neste guia. Por enquanto, só precisamos saber como vincular um ponteiro ao endereço de uma variável.
Um ponto importante a ser observado é: O tipo de dados do ponteiro e a variável deve corresponder, um ponteiro int pode conter o endereço da variável int, da mesma forma um ponteiro declarado com tipo de dados float pode conter o endereço de uma variável float. No exemplo abaixo, o ponteiro e a variável são do tipo int.
Resultado:
Address of variable num is: 0x7fff5694dc58
Ponteiros C – operadores usados com ponteiros
Vamos discutir os operadores & e * que são usados com ponteiros C.
“Endereço do” (&) Operador
Já vimos no primeiro exemplo que podemos exibir o endereço de uma variável usando e comercial sinal. Usei & num para acessar o endereço da variável num. O operador & também é conhecido como “Endereço do” Operador.
printf("Address of var is: %p", &num);
Nota importante:% p é um especificador de formato usado para exibir o endereço em formato hexadecimal.
Agora que você sabe como obter o endereço de uma variável, mas como armazenar esse endereço em alguma outra variável? É aí que os ponteiros entram em cena. Conforme mencionado no início deste guia, os ponteiros na programação C são usados para manter o endereço de outras variáveis.
O ponteiro é como outra variável, a principal diferença é que ele armazena o endereço de outra variável em vez de um valor.
Operador “Valor no endereço” (*)
O operador * também é conhecido como operador Valor no endereço.
Como declarar um ponteiro ?
Os exemplos acima são alguns exemplos de declarações de ponteiro. Se você precisa de um ponteiro para armazenar o endereço da variável inteira, o tipo de dados do ponteiro deve ser int. O mesmo caso é com os outros tipos de dados.
Usando o operador *, podemos acessar o valor de uma variável por meio de um ponteiro.
Por exemplo:
double a = 10;double *p;p = &a;
* p nos forneceria o valor da variável a. A instrução a seguir exibiria 10 como saída.
printf("%d", *p);
Da mesma forma, se atribuirmos um valor a * ponteiro como este:
*p = 200;
Isso mudaria o valor de v ariável a. A instrução acima mudará o valor de a de 10 para 200.
Exemplo de ponteiro demonstrando o uso de & e *
Saída :
Value of variable var is: 10Value of variable var is: 10Address of variable var is: 0x7fff5ed98c4cAddress of variable var is: 0x7fff5ed98c4cAddress of pointer p is: 0x7fff5ed98c50
Vamos pegar mais alguns exemplos para entendê-lo melhor –
Digamos que temos uma variável char ch e um ponteiro ptr que contém o endereço de ch.
char ch="a";char *ptr;
Leia o valor de ch
printf("Value of ch: %c", ch);orprintf("Value of ch: %c", *ptr);
Altere o valor de ch
ch = "b";or*ptr = "b";
O código acima substituiria o valor a por b .
Você consegue adivinhar a saída do seguinte programa C?
Resultado:
Address of var is: 0x7fff5d027c58Address of var is: 0x7fff5d027c58Value of var is: 10Value of var is: 10Value of var is: 10Value of pointer p is: 0x7fff5d027c58Address of pointer p is: 0x7fff5d027c50
Mais tópicos em Ponteiros
1) Ponteiro para Ponteiro – Um ponteiro pode apontar para outro ponteiro (o que significa que pode armazenar o endereço de outro ponteiro), tais ponteiros são conhecidos como ponteiro duplo OU ponteiro a ponteiro.
2) Passando ponteiros para função – Ponteiros também podem ser passados como um argumento para uma função, usando este recurso, uma função pode ser chamada por referência, assim como um array pode ser passado para uma função durante a chamada.
3) Ponteiros de função – Um ponteiro de função é como outro ponteiro, é usado para armazenar o endereço de uma função. O ponteiro de função também pode ser usado para chamar uma função no programa C.