Ponteiros armazenam o endereco de variaveis ou de uma posicao de memoria.
1.2. Para Usar Ponteiros em C, Precisamos Entender Dois Operadores Unarios (* e &)
Para declarar uma variavel ponteiro, usamos o operador unario * (asterisco) antes do nome.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>intmain()
{
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);
}
Para acessar o endereco de uma variavel em um ponteiro, usamos o operador unario & (ampersand), que retorna o endereco da variavel. Por exemplo, &x retorna o endereco da variavel x.
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>intmain()
{
int x;
/* Imprime o endereco de x */printf("%p", &x);
return(0);
}
Para acessar o valor armazenado no endereco, usamos o operador unario * (asterisco), que retorna o valor da variavel localizada no endereco especificado pelo operando.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>intmain()
{
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.
1.3. Expressoes de Ponteiro e Aritmetica de Ponteiros
Um conjunto limitado de operacoes aritmeticas pode ser feito com ponteiros. Um ponteiro pode ser:
incrementado (++)
decrementado (--)
somado a um inteiro (+ ou +=)
subtraido por um inteiro (- ou -=)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>intmain()
{
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>intmain()
{
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).