0% acharam este documento útil (0 voto)
4 visualizações31 páginas

Aula 5

O documento aborda conceitos de arrays e ponteiros em C, incluindo a inicialização de arrays unidimensionais e multidimensionais, operações de aritmética de ponteiros e a passagem de arrays como parâmetros para funções. Ele explica como ponteiros se relacionam com arrays e fornece exemplos práticos de acesso e manipulação de dados. Além disso, apresenta exercícios para reforçar o aprendizado sobre o tema.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações31 páginas

Aula 5

O documento aborda conceitos de arrays e ponteiros em C, incluindo a inicialização de arrays unidimensionais e multidimensionais, operações de aritmética de ponteiros e a passagem de arrays como parâmetros para funções. Ele explica como ponteiros se relacionam com arrays e fornece exemplos práticos de acesso e manipulação de dados. Além disso, apresenta exercícios para reforçar o aprendizado sobre o tema.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Programação II

Marcel Campos Inocencio


[Link]@[Link]

Aula 5 – Arrays e Ponteiros


sizeof()
Retorna o tamanho em bytes de uma variável ou
um array. Para obter o tamanho de um array, basta
passar seu nome, caso um índice seja passado o
tamanho será de um elemento.
Inicialização de Array
Unidimensional
A forma de inicializar os valores de um array é
semelhante a inicialização de uma variável. Os
valores são passados entre { }.
Inicialização de Array
Multidimensional
Todos os elementos em sequencia:
Inicialização de Array
Multidimensional
Cada linha é separada por { } :
Ponteiros
Ponteiros estão diretamente ligados a arrays. Na
tabela abaixo, podemos verificar as operações
que podem ser executadas com ponteiros.
OPERAÇÃO Exemplo
Soma de um inteiro a um ponteiro p+2
Subtração de um inteiro a um ponteiro p–3
Incremento de ponteiro ++p ou p++
Decremento de ponteiro --p ou p--
Subtração entre dois ponteiros do mesmo tipo p1 – p2
Aritmética de Ponteiros
Operações aritméticas com ponteiros, são interpretadas
de modo diferente das operações normais.
Se um ponteiro é declarado:
int *p;
A expressão
p+3
Deve ser interpretada como o endereço da posição de
memória que esta 3 objetos do tipo int adiante da
posição que p aponta.
Aritmética de Ponteiros
Como p é um endereço p + 3 também será um
endereço.
Ao invés de apenas adicionar 3 ao endereço de
memória de p, o compilador adiciona 3
multiplicado pelo tamanho do objeto (chamado de
fator de escala) ao qual p aponta.
Supondo que p é inteiro, p + 3, seria o mesmo que
somar o tamanho (em bytes) de 3 inteiros a p.
Aritmética de Ponteiros
Supondo que o endereço apontado por p seja e
e que o tipo de dado seja int de 4 bytes. Então
p+3 significa, aplicando o fator de escala e+3*4,
que seria o endereço e + 12.
Aritmética de Ponteiros
Subtrair um inteiro de um ponteiro, tem o
mesmo significado. Ao subtrair 3 do ponteiro p
(p – 3) estamos nos referenciando ao terceiro
objeto do tipo apontado pelo ponteiro p que
precede o objeto atualmente apontado por ele.
Aritmética de Ponteiros
A subtração de dois ponteiros é legal, desde os
ponteiros apontem para o mesmo tipo de dado. O
resultado desta operação é um inteiro, cujo valor
absoluto representa a quantidade de objetos entre
os valores subtraídos +1:
&arr[3] - &arr[0]
Resulta em 3, significando que existem 2 objetos do
tipo dos elementos do array arr entre arr[3] e
arr[0].
Aritmética de Ponteiros
Operações de incremento(++) e decremento(--)
de ponteiros são praticas comuns em C, tendo
em vista que ao incrementar um ponteiro
estamos acessando o próximo elemento
(adicionando o fator de escala).
Aritmética de Ponteiros
Exemplos:
Ponteiros X Array Unidimensionais
Suponha o seguinte exemplo:
long arr[4];
long *p;
A atribuição a seguir aponta p para o primeiro
elemento do array:
p = &arr[0];
Logo, a indireção de p (*p) resulta no valor de p[0];
Ponteiros X Array Unidimensionais
Utilizando aritmética de ponteiros, podemos
acessar os demais elementos do array. Ao
utilizar p+1 estamos nos referindo ao endereço
de arr[1] e *(p+1) resulta em arr[1].

p + 1 é o mesmo que &arr[1]


*(p + 1) é o mesmo que arr[1]
Ponteiros X Array Unidimensionais
Podemos fazer as seguintes relações:

p + i é o mesmo que &arr[i]

arr é o mesmo que &arr[0]

*(p + i) é o mesmo que arr[i]


Ponteiros X Array Unidimensionais
Quando o compilador encontra, por exemplo a
expressão arr[2], o que ele faz é adicionar o
índice ao elemento principal do array e aplica o
operador de indireção, transformando arr[2] em
*(arr+2), obtendo assim o valor do elemento do
array.
Ponteiros X Array Unidimensionais
Exemplos:
Passagem de Parâmetros
Em C, não é possível passar um array por
parâmetro. Portanto devemos passar um ponteiro
para o valor inicial do array, logo:
void minhaFuncao(float *arr)
e
void minhaFuncao(float arr[])
Possuem a mesma interpretação pelo compilador,
já que o mesmo converte a segunda declaração
para um ponteiro.
Passagem de Parâmetros
Quando passamos um ponteiro para um array, a
utilização da função sizeof para determinar o
tamanho do array dentro de uma função resultara
em um valor incorreto:
Passagem de Parâmetros
É possível calcular a quantidade de elementos de
um array dividindo seu tamanho, pelo tamanho de
um elemento.
Arrays Multidimensionais
Em C, um array int arr[3][2], pode ser
interpretado como um array unidimensional de
tamanho 3, cujos elementos são arrays de
elementos do tipo int de tamanho 2.
Ponteiros X Array
Multidimensionais
Uma referência a um elemento do array (arr), tal
como:
arr[2][1]
É interpretada pelo compilador como:
*(arr[2] + 1)
Que resulta em:
*( *(arr + 2) + 1)
Ponteiros X Array
Multidimensionais
No exemplo anterior, levando-se em
consideração o fator de escala, o +2 por se tratar
de um array bidimensional é multiplicado por 2
e logo, pelo tamanho do dado (int 4 bytes). O +1
no final por não se tratar de um array, é
simplesmente multiplicado pelo fator de escala.
Exercícios
1. Como um nome de array passado como
argumento para uma função é interpretado?
2. Por que a aplicação de sizeof num parâmetro
que representa um array não resulta no
tamanho em bytes do array?
3. Se um array é passado para uma função e um de
seus elementos é alterado, esta alteração é
reconhecida na porção do programa que
chamou a função?
Exercícios
4. O tipo de retorno de uma função pode ser
um array? Por que?
5. Quando se atribuem valores a elementos de
um array multidimensional, qual a vantagem
de se incluírem chaves em torno de grupos
de valores?
6. Explique a relação existente entre o nome de
um array unidimensional e um ponteiro.
Exercícios
7. Descreva duas formas diferentes de se
especificar o endereço de um elemento de um
array unidimensional.
8. Descreva duas formas diferentes de se acessar o
valor de um elemento de um array
unidimensional.
9. Quando um inteiro é adicionado ou subtraído a
um ponteiro, como a operação é interpretada?
10. O que é fator de escala?
Exercícios
11. Coloque chaves em torno de cada linha da
iniciação a seguir e utilize uma forma de
endentação que melhore a legibilidade dela.
int arr[5][3] = {1, 2, 3, 4, 5, 6, 7};
12. O que há de errado com o seguinte trecho do
programa?
int j, arr[5] = { 1, 2, 3, 4, 5 };
for (j=1; j < 5; ++j)
printf(“%d\n”,arr[j]);
Exercícios
13. Considere a seguinte iniciação do array arr:
int ar[] = {4, 5, 8, 9, 8, 1, 0, 1, 9, 3};
a) Escreva um programa imprimindo todos os
valores do array, utilizando índices;
b) Reescreva o programa utilizando aritimética
de ponteiros.
Exercícios
14. O C não controla os limites dos vetores, o programador deve fazê-lo. Encontre os
erros e corrija-os:
a) void main(){
int arint[] = {1,2,3,4,5,6,7};
int size = 7, i, *pi;
for (pi = arint, i = 0; i < size; i++, pi += 2)
printf("%d", *pi);
}
b) void main(){
int arint[] = {1,2,3,4,5,6,7};
int size = 10;
int i;
for (pi = arint, i = 0; i < size; i++)
printf("%d", arint[i]);
}
Exercícios
15. Escreva um programa que permita obter o
tamanho em bytes dos tipos de dados: int,
long, float, double e char.

16. Declare um array bidimensional de 5 x 3 e


utilizando aritmética de ponteiros, inicialize
todas as posições do array em 100;

Você também pode gostar