Академический Документы
Профессиональный Документы
Культура Документы
Estruturas de Dados
Referências
Tópicos
• Vetores
• Alocação dinâmica
• Vetores locais e funções
int v1,v2,v3;
char letra;
Pilha de memória
7013
letra - 7012
v3 - 7008
v2 - 7004
v1 - 7000
Vetores
• Vetor:
– estrutura de dados definindo um conjunto homogêneo
– Exemplo: - 140
• v = vetor de inteiros com 10 elementos - 136
- 132
int v[10];
- 128
- 124
- 120
- 116
- 112
- 108
16/3/2006 (c) Dept. Informática - PUC-Rio
v - 104
5
Vetores: inicialização
int a=2;
v[10]={2,3,5,7,11,13,17,19,23,29};
29 140
Liberalidade da linguagem: 23 136
int v[]={2,3,5,7,11,13,17,19,23,29}; 19 132
17 128
13 124
11 120
7 116
5 112
3 108
16/3/2006 (c) Dept. Informática - PUC-Rio
v 2 104
6
int v[10]={2,3,5,7,11,13,17,19,23,29};
v[9] 29 140
v[8] 23 136
v[7] 19 132
v[6] 17 128
v[5] 13 124
v[4] 11 120
v[10]=31; não pode!
invade a meméria da v[3] 7 116
próxima variável! v[2] 5 112
v[1] 3 108
16/3/2006 (c) Dept. Informática - PUC-Rio
v[0] 2 104
7
int v[7]={1,3,5,7,9,11,13};
int i;
ou: 140
int v[7]; 136
int i; i 132
v[6] 13 128
for (i=0; i<7; i++) { v[5] 11 124
v[i]=2*i+1; v[4] 9 120
} v[3] 7 116
v[2] 5 112
v[1] 3 108
16/3/2006 (c) Dept. Informática - PUC-Rio
v[0] 1 104
8
Vetores e Ponteiros
int v[7];
140
Quem é v?
136
132
13 128
v é um ponteiro de valor 11 124
constante que aponta 9 120
para o primeiro elemento 7 116
do vetor de inteiros! 5 112
3 108
16/3/2006 (c) Dept. Informática - PUC-Rio v → 1 9
104
int v[7];
Vetores
• Exemplo:
– cálculo da média e da variância
de um conjunto de 10 números reais
x (x − m )2
m= , v=
N N
– implementação
• valores são lidos e armazenados em um vetor de 10 posições
• cálculos da média e da variância efetuados sobre o conjunto de
valores armazenado
#define MAX 50
scanf("%d",&n);
for (i = 0; i < n; i++)
scanf("%f", &v[i]);
Vetores
#include <stdio.h>
#define MAX 50
med = media(n,v);
var = variancia(n,v,med);
Vetores
Alocação Dinâmica
• Uso da memória:
– uso de variáveis globais (e estáticas):
• espaço reservado para uma variável global existe
enquanto o programa estiver sendo executado
– uso de variáveis locais:
• espaço existe apenas enquanto a função que declarou a variável
está sendo executada
• liberado para outros usos quando a execução da função termina
– variáveis globais ou locais podem ser simples ou vetores:
• para vetor, é necessário informar o número máximo de elementos
pois o compilador precisa calcular o espaço a ser reservado
Alocação Dinâmica
• Uso da memória:
– alocação dinâmica:
• espaço de memória é requisitada em tempo de execução
• espaço permanece reservado até que seja explicitamente liberado
– depois de liberado, espaço estará disponibilizado para outros usos e
não pode mais ser acessado
– espaço alocado e não liberado explicitamente,
será automaticamente liberado quando ao final da execução
Alocação Dinâmica
• Uso da memória:
– memória estática: Código do programa
memória
estática
• código do programa Variáveis globais e
• variáveis globais Variáveis estáticas
• variáveis estáticas Variáveis alocadas
– memória dinâmica: dinamicamente
• variáveis alocadas
dinâmica
memória
dinamicamente
Memória livre
• memória livre
• variáveis locais
Variáveis locais
(Pilha de execução)
Alocação Dinâmica
• Uso da memória:
– alocação dinâmica de memória: Código do programa
memória
estática
Alocação Dinâmica
Alocação Dinâmica
Alocação Dinâmica
• Função “malloc”:
– recebe como parâmetro o número de bytes que se deseja alocar
– retorna um ponteiro genérico para o endereço inicial da área de
memória alocada, se houver espaço livre:
• ponteiro genérico é representado por void*
• ponteiro é convertido automaticamente para o tipo apropriado
• ponteiro pode ser convertido explicitamente
– retorna um endereço nulo, se não houver espaço livre:
• representado pelo símbolo NULL
• Função “sizeof”:
– retorna o número de bytes ocupado por um tipo
• função “free”:
– recebe como parâmetro o ponteiro da memória a ser liberada
• a função free deve receber um endereço de memória que tenha sido
alocado dinamicamente
16/3/2006 (c) Dept. Informática - PUC-Rio 25
Alocação Dinâmica
• Exemplo:
– alocação dinâmica de um vetor de inteiros com 10 elementos
• malloc retorna o endereço da área alocada para
armazenar valores inteiros
• ponteiro de inteiro recebe endereço inicial do espaço alocado
int* v;
v = (int* ) malloc(10*sizeof(int));
Alocação Dinâmica
• Exemplo (cont.):
v = (int* ) malloc(10*sizeof(int));
! "
# $
% &
$ ) $ )
* ) * )
+ +
, - , -
( /
' (
.
.
' (
Alocação Dinâmica
• Exemplo (cont.):
– v armazena endereço inicial de uma área contínua de memória
suficiente para armazenar 10 valores inteiros
– v pode ser tratado como um vetor declarado estaticamente
• v aponta para o inicio da área alocada
• v[0] acessa o espaço para o primeiro elemento
• v[1] acessa o segundo
• .... até v[9]
Alocação Dinâmica
• Exemplo (cont.):
– tratamento de erro após chamada a malloc
• imprime mensagem de erro
• aborta o programa (com a função exit)
…
v = (int*) malloc(10*sizeof(int));
if (v==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}
…
#include <stdlib.h>
med = media(n,v);
var = variancia(n,v,med);
• Exemplo:
– produto vetorial de dois vetores u e v em 3D,
representados pelas três componentes x, y, e z
u × v = { u y v z − v y u z , u z vx − v z u x , u x v y − v x u y }
Resumo
Vetor:
alocação de vetor: tipo nome[ #elementos];