Ponteiros

1. Ponteiros

1.1. Definicao

Ponteiros armazenam o endereco de variaveis ou de uma posicao de memoria.

Visao geral de ponteiros

1.2. Para Usar Ponteiros em C, Precisamos Entender Dois Operadores Unarios (* e &)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include<stdio.h>

int main()
{
    int x = 10;
    int *ptr;

    /* O operador & antes de x e usado para obter
     * o endereco de x e depois esse endereco
     * e atribuido a ptr. */
    ptr = &x;

    return(0);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include<stdio.h>

int main()
{
    int x;

    /* Imprime o endereco de x */
    printf("%p", &x);
    return(0);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include<stdio.h>

int main()
{
    int x = 10;
    int *ptr = &x;

    printf("Value of x = %d\n", *ptr);
    printf("Address of x = %p\n", ptr);

    *ptr = 20;
    printf("After doing *ptr = 20, now *ptr is %d\n", *ptr);
    printf("After doing *ptr = 20, now x is %d\n", x);

    return(0);
}

Consulte a imagem abaixo para visualizar melhor o que esse codigo faz.

Visualizacao de ponteiro

1.3. Expressoes de Ponteiro e Aritmetica de Ponteiros

Um conjunto limitado de operacoes aritmeticas pode ser feito com ponteiros. Um ponteiro pode ser:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<stdio.h>

int main()
{
    int v[3] = {10, 20, 30};

    int *ptr;
    ptr = v;

    for (int i = 0; i < 3; i++) {
        printf("Value of *ptr = %d\n", *ptr);
        printf("Value of ptr = %p\n", ptr);
        ptr++; /* Incrementa o ponteiro ptr em 1 (tamanho de um inteiro = 4) */
    }
}

1.4. Nome de Array como Ponteiro

O nome de um array se comporta como uma constante ponteiro. O valor dessa constante e o endereco do primeiro elemento. Por exemplo, se temos um array chamado v, entao v e &v[0] podem ser usados de forma equivalente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include<stdio.h>

int main()
{
    int v[3] = {10, 20, 30};
    int *ptr;
    ptr = v;  /* O mesmo que ptr = &v[0]; */

    printf("The elements of the array are: %d - %d - %d\n", ptr[0], ptr[1], ptr[2]);
}

1.5. Ponteiros e Arrays Multidimensionais

Para notacao de ponteiros em arrays numericos bidimensionais, considere a declaracao abaixo:

1
int nums[2][3]  =  { {16, 18, 20}, {25, 26, 27} };

Em geral, nums[i][j] e equivalente a *(*(nums+i)+j).

Notacao de ArrayNotacao de PonteiroValor
nums[0][0]*(*nums)16
nums[0][1]*(*nums + 1)18
nums[0][2]*(*nums + 2)20
nums[1][0]*(*(nums + 1))25
nums[1][1]*(*(nums + 1) + 1)26
nums[1][2]*(*(nums + 1) + 2)27