Você está na página 1de 7

04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados


Ponteiro em C: Arrays
Por Fernando Deluno Garcia - 16/12/2015


ÍNDICE DE CONTEÚDO [MOSTRAR]

Este post faz parte da série Ponteiro em C. Leia também os outros posts da série:

Ponteiro em C: Resumo
Ponteiro em C: De nição
Ponteiro em C: Aritmética de ponteiro
Ponteiro em C: Arrays
Ponteiro em C: Funções
Ponteiro em C: Estruturas
Ponteiro em C: Alocação Dinâmica de Memória
Ponteiro em C: Tipo de Dado Abstrato
Ponteiro em C: Polimor smo

Continuando o assunto abordado no segundo artigo, sobre Aritmética de ponteiro,


veremos algumas aplicações envolvendo aritmética de ponteiros e a sua relação
com arrays. Em um dos exemplos mostrados no artigo anterior foi demonstrada a
operação de incremento, evidenciando que ao incrementar um ponteiro, ele era
deslocado para o próximo dado. Diante disso, veremos que há uma estreita relação
entre ponteiros e arrays.

Ponteiros e Arrays

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 1/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados

Arrays unidimensionais, ou vetores, são um conjunto de dados de mesmo tipo e que


são armazenados em posições contíguas da memória [1]. Considere, por exemplo,
um vetor de inteiros com 10 elementos armazenados a partir do endereço 108. No
código abaixo é mostrado o exemplo ilustrado na Figura 1.

1 int v[] = {5, 10, 15, 3, 10, 76, 5, 13, 33, 45};
2 int * pt;
3
4 pt = v; //atribui o endereço do vetor

Um ponteiro é criado e passa a apontar para o primeiro elemento do vetor. Para


atribuir o endereço de um vetor para um ponteiro basta utilizar o próprio nome do
vetor, isto é, o nome representa o endereço do primeiro elemento.

Figura 1: Representação de um ponteiro com o endereço base de um vetor.

Para obter o endereço de outro índice é necessário utilizar o operador ‘&’. Portanto,
as duas atribuições mostradas abaixo são equivalentes.

1 pt = v;
2 pt = &v[0];

Logo, o endereço do quinto elemento pode ser obtido da seguinte forma:

1 pt = &v[4];

Essa situação é ilustrada na Figura 2.

Figura 2: Ponteiro com o endereço do quinto elemento do vetor.

Diante disso, veri ca-se que o elemento de um vetor é armazenado numa posição de
memória na qual o seu endereço é equivalente à soma do endereço base com o

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 2/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados

total de bytes dos elementos até a posição desejada. Dito de outra maneira, se pt
aponta para o endereço base do vetor então ‘V[n]’ é equivalente ‘*(pt + n)’. Na gura 3
é ilustrado essa alteração do endereço apontado.

Figura 3: Modificação do endereço apontado.

Por exemplo, para exibir os 10 elementos desse vetor.

1 int v[] = {5, 10, 15, 3, 10, 76, 5, 13, 33, 45};
2 int * pt;
3 int i;
4
5 pt = v;
6
7 for(i = 0; i < 10; i++)
8 {
9 printf("V[%i] = %i\r\n", i, *(pt + i));
10 }

De fato, as duas formas de indexar os elementos do vetor apresentam o mesmo


resultado, contudo a aritmética de ponteiros pode ser mais rápida do que a
indexação direta, pois na indexação direta o endereço do elemento que será
acessado é sempre calculado (somar o endereço base com a posição desejada) [1].
Uma pequena alteração no exemplo acima faz o ponteiro alterar o endereço
conforme a iteração.

1 int v[] = {5, 10, 15, 3, 10, 76, 5, 13, 33, 45};
2 int * pt;
3 int i;
4
5 pt = v;
6
7 for(i = 0; i < 10; i++)
8 {
9 printf("V[%i] = %i\r\n", i, *pt++);
10 }

Outro exemplo  com aritmética de ponteiros é mostrado abaixo.

1 char *pointer1 = &table[0];


2 char *pointer2 = &table[49];
3
4 *pointer1++ = *--pointer2;

Neste exemplo, dois ponteiros são utilizados numa operação de atribuição. O código
assembly gerado (AVR 8 bits) para este código é mostrado abaixo.

1 LD R16,-Z ; Pre-decrement Z pointer and load data

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 3/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados
2 ST X+,R16 ; Store data and post increment

Esse exemplo mostra como os modos de endereçamento podem ser explorados


utilizando operações com ponteiros. Note que as duas instruções utilizadas
possuem as operações de incremento e decremento.

De modo geral:

*(pt + i) é igual a V[i].


(pt + i) é igual a &V[i].

Array de Ponteiros

Os ponteiros também podem ser declarados na forma de vetores. Considere o


exemplo abaixo que de ne um vetor de ponteiros com 4 elementos e mais quatros
vetores de 3 elementos.

1 int * pt [4]; //vetor de ponteiros do tipo inteiro


2 int v1[3] = {1, 2, 3}; //vetor 1 com três elementos
3 int v2[3] = {4, 5, 6}; //vetor 2 com três elementos
4 int v3[3] = {7, 8, 9}; //vetor 3 com três elementos
5 int v4[3] = {10, 11, 12}; //vetor 4 com três elementos
6
7 pt[0] = v1; //atribui o endereço do vetor1 para o ponteiro pt[0]
8 pt[1] = v2; //atribui o endereço do vetor2 para o ponteiro pt[1]
9 pt[2] = v3; //atribui o endereço do vetor3 para o ponteiro pt[2]
10 pt[3] = v4; //atribui o endereço do vetor4 para o ponteiro pt[3]

Esse exemplo é ilustrado na Figura 4.

Figura 4: Vetor de ponteiros do tipo inteiro.

Agora, é necessário lembrar que ao acessar os elementos pt[0], pt[1], pt[2] e pt[3],
estaremos manipulando ponteiros. Para acessar os elementos de cada vetor a partir

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 4/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados

dos ponteiros basta utilizar o operador ‘*’ e indicar o índice desejado. Considere os
casos abaixo:

*pt[0] é o valor 1, pois estamos acessando o conteúdo do endereço 116, ou seja,


v1[0];
*pt[1] é o valor 4, pois estamos acessando o conteúdo do endereço 128, ou seja,
v2[0];
*pt[2] é o valor 7, pois estamos acessando o conteúdo do endereço 140, ou seja,
v3[0];
*pt[3] é o valor 10, pois estamos acessando o conteúdo do endereço 152, ou seja,
v4[0].

Esse mesmo resultado pode ser obtido da seguinte forma:

*(*(pt+0)) é o valor 1;
*(*(pt+1)) é o valor 4;
*(*(pt+2)) é o valor 7;
*(*(pt+3)) é o valor 10.

A parte destacada em negrito de ne o elemento de ‘pt’ que está sendo acessado.


Esse termo é o endereço do vetor que queremos acessar, portanto ao fazer o uso do
operador * indicamos que o conteúdo desse endereço deve ser acessado. O acesso
aos outros elementos é mostrado na Figura 5.

Figura 5: Acessando elementos do vetor de inteiros a partir do vetor de ponteiros.

Conclusão

Nesse artigo foi demonstrado como acessar arrays utilizando ponteiros. Essa é uma
técnica muito utilizada, pois é um meio mais rápido de acessar os elementos
quando comparada com a indexação direta do vetor. Assim como no artigo anterior,
destacou-se a importância do tipo de dado do ponteiro, já que as operações
aritméticas realizadas dependem dessa informação. Outro caso demonstrado foi o
de um array de ponteiros, caso semelhante ao de declaração de uma matriz de
strings. Essas características podem aumentar a e ciência de rotinas e permitem
estruturar melhor o código.

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 5/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados

Referências

[1] – Livro: C, completo e total – 3ª edição revista e atualizada. Herbert Schildt.

[2] – AVR035: E cient C coding for AVR 

Fonte da imagem destacada: http://listamaze.com/top-10-programming-languages-


for-job-security/ 

Outros artigos da série


<< Ponteiro em C: Aritmética de ponteiroPonteiro em C: Funções >>

Este post faz da série Ponteiro em C. Leia também os outros posts da série:

Ponteiro em C: Resumo
Ponteiro em C: De nição
Ponteiro em C: Aritmética de ponteiro
Ponteiro em C: Arrays
Ponteiro em C: Funções
Ponteiro em C: Estruturas

u
Ponteiro em C: Alocação Dinâmica de Memória
Ponteiro em C: Tipo de Dado Abstrato
Ponteiro em C: Polimor smo

NEWSLETTER
Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas,
tutoriais e promoções.

E-mail

CADASTRAR E-MAIL

Fique tranquilo, também não gostamos de spam.

Esta obra está licenciada com uma Licença Creative Commons Atribuição-
CompartilhaIgual 4.0 Internacional .

Fernando Deluno Garcia

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 6/7
04/04/2019 Aprenda sobre Arrays - Série Ponteiro em C - Embarcados

Fascinado por computação, especialmente na interface entre hardware e software, me engajei na


área de sistemas embarcados. Atuo com desenvolvimento de sistemas embarcados e sou docente
da Faculdade de Engenharia de Sorocaba.Para mais informações: https://about.me/fdelunogarcia

  

Este site utiliza cookies. Ao usá-lo você concorda com nossos Termos de Uso.
Continuar
Saiba mais.

https://www.embarcados.com.br/ponteiro-em-c-arrays/#Array-de-Ponteiros 7/7

Você também pode gostar