,
O ponteiro na linguagem C é uma ferramenta muito poderosa para realizar determinadas tarefas. É um conceito que precisa de compreender se quiser melhorar as suas competências em C. Alguns algoritmos serão mais complicados ou mesmo impossíveis de escrever sem o uso de ponteiros.
Introdução
Num programa, qualquer elemento definido (variáveis, objectos, funções, etc.) é armazenado na memória num endereço específico. Para encontrar esse elemento, basta saber o endereço de memória utilizado pelo elemento, ou o primeiro endereço utilizado se a variável ocupar várias áreas de memória.
Um ponteiro é uma variável que contém o endereço de memória de outra variável (ou objeto). Embora o valor de um ponteiro seja sempre um número inteiro, o seu tipo depende do objeto para o qual aponta.
Declarar um ponteiro
O tipo do ponteiro deve ser idêntico ao tipo da variável a que se dirige.
<type> * <pointer_name> //ou <type> *<pointer_name>
Ex:
float myfloat float * myfloataddress; int myint int * myintaddress;
Podemos, portanto, inicializar a variável e o seu endereço na mesma linha
int i,*pi;
Operação sobre ponteiros
O endereço de uma variável é um número inteiro. Por conseguinte, é possível adicionar e subtrair um número inteiro a um endereço para obter um ponteiro do mesmo tipo para um endereço diferente.
ptr+i –> endereço contido em ptr + i * ptr tipo tamanho
Também pode subtrair dois endereços que apontam para o mesmo tipo. A subtração é útil, por exemplo, quando os dois ponteiros apontam para a mesma matriz para descobrir o número de elementos entre os dois elementos apontados.
ptr1-ptr2 –> (endereço apontado por ptr1 – endereço apontado por ptr2)/(ptr1 e ptr2 tipo tamanho)
Também é possível comparar valores de endereço usando o <,>,<=,>=,!= e ==
Modificar o valor de uma variável utilizando um ponteiro
No exemplo seguinte, x é uma variável inteira e p é um ponteiro inteiro que contém o endereço da variável x. O valor de x, inicializado em 3, é alterado para 21 utilizando o ponteiro.
int x=3; int * p=&amp;x; *p=21; // is equivalent to x=21; printf("valeur de *p = %d\n",*p); // equivalent to printf("valeur de x = %d\n",x);
Modificar uma variável na entrada de uma função
Em C, uma função só pode devolver uma única variável. Para devolver vários valores, é possível utilizar os ponteiros destas variáveis de entrada em vez de devolver os próprios valores.
#include <iostream> int myparam=5; struct mystruct_T{ int val1; int val2; }STRUCT; void change_struct( mystruct_T * mystruct, int * param) { mystruct->val1=10; *param=26; } int main(){ change_struct(&STRUCT, &myparam); printf("Struct.val1 : %d",STRUCT.val1); printf("param : %d",myparam); }
Com este método, é possível modificar várias variáveis como se a função estivesse a devolver vários valores.
Breve resumo
- Um ponteiro é uma variável que contém o endereço de outra variável
- Para aceder ao endereço da variável var, utilize o operador de endereço (&): &var
- Para obter o valor da variável a partir do endereço, utilize o operador de indirecção unário(*) : *pointer
- Quando é utilizado um ponteiro de estrutura, o operador -> é utilizado para aceder ao membro da estrutura: mystruct->elm1
- É possível apontar para funções