fbpixel
Etiquetas: ,

,

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.

code-c-pointer-principle Um rápido olhar sobre o ponteiro em C

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;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-&gt;val1=10;
   *param=26;
}

int main(){
    change_struct(&amp;STRUCT, &amp;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

Fontes