150 likes | 270 Views
CURSO DE C - 2010. AULA 05: Vetores. APRESENTAÇÃO: REBERTH DOUGLAS BANDEIRA CAVALCANTE. ORGANIZAÇÃO DO CURSO DE C / 2010. TÓPICOS ABORDADOS:. TUTORES:. Conceitos Expressões Fluxo Funções Vetores String Matrizes Estruturas Arquivo.
E N D
CURSO DE C - 2010 AULA 05: Vetores APRESENTAÇÃO: REBERTH DOUGLAS BANDEIRA CAVALCANTE
ORGANIZAÇÃO DO CURSO DE C / 2010 TÓPICOS ABORDADOS: TUTORES: • Conceitos • Expressões • Fluxo • Funções • Vetores • String • Matrizes • Estruturas • Arquivo • Anderson Caldas (anderson@lccv.ufal.br) • Giancarlo Gusmão (giancarlogusmao@lccv.ufal.br) • David Anderson (dacd@lccv.ufal.br) • Michele Agra (micheleagra@lccv.ufal.br) • Reberth Douglas (rdbc@lccv.ufal.br) DURAÇÃO ~ 2,5 MESES
1. Introdução • A forma mais simples de estruturarmos um conjunto de dados é por meio de vetores. Como a maioria das linguagens de programação, C permite a definição de vetores. Vetores e Alocação Dinâmica, W. Celes e J. L. Rangel int v[10]; A declaração acima diz que: v é um vetor de inteiros dimensionado com 10 elementos. Cada intocupa 4 bytes, totalizando para a declaração acima 40 bytes. Acesso aos elementos do vetor ? v[0] – acessa o 1º elemento de v v[1] – acessa o 2º elemento de v … v[9] – acessa o 9º elemento de v 0 … n-1 v[10] Invasão de memória
2. Exemplo 1 Determinação da média e da variância de um conjunto de 10 elementos fornecidos via teclado. V[i] representa o (i+1)-ésimo elemento do vetor, &v[i] representa o endereço da memória onde esse elemento está armazenado.
3. Ponteiros e Vetores • Na verdade, existe uma associação forte entre vetores e ponteiros, pois se existe a declaração: • intv[10] • a variável v, que representa o vetor, é uma constante que armazena o endereço inicial do vetor, isto é, sem indexação, aponta para o primeiro elemento do vetor. Vetores e Alocação Dinâmica, W. Celes e J. L. Rangel A linguagem C também suporta aritmética de ponteiros. Podemos somar e subtrair ponteiros, desde que o valor do ponteiro resultante aponte para dentro da área reservada para o vetor. Com isso, num vetor temos as seguintes equivalências: v+0 – aponta para o primeiro elemento do vetor; v+1 – aponta para o segundo elemento do vetor; … v+9 – aponta para o último elemento do vetor; • &v[i] = (v+i) • v[i] = *(v+i) Os vetores também podem ser inicializados na declaração: int v[5] = {5, 10, 15, 20, 25} ou int v[ ] = {5, 10, 15, 20, 25}
4. Exemplo 2 • Passar um vetor para uma função consiste em passar o endereço da primeira posição do vetor. Se passarmos um valor de endereço, a função chamada deve ter um parâmetro do tipo ponteiro para armazenar este valor. Vetores e Alocação Dinâmica, W. Celes e J. L. Rangel Passar para uma função um vetor de int, significa ter um parâmetro do tipo int*, capaz de armazenar endereços de inteiros. Os elementos do vetor não são copiados para a função, o argumento copiado é apenas o endereço do primeiro elemento. Como é passado para a função o endereço do primeiro elemento do vetor, podemos alterar os valores dos elementos do vetor dentro da função
5. Alocação Dinâmica • Até agora, na declaração de um vetor, devemos saber de antemão sua dimensão. Ou seja, o vetor tem sua dimensão pré-definida. Isso é um fator limitante em situações em que não sabemos previamente a quantidade de dados a ser armazenados. EXEMPLO: Desenvolver um programa para calcular a média e a variância das notas de uma prova de Cálculo I. Teremos que prever quantos alunos fizeram essa prova. Podemos imaginar em: Dimensionar o vetor com um número absurdamente alto. Desperdício de memória Alocação dinâmica
6. Uso da Memória • Informalmente, podemos dizer que existem três maneiras de reservarmos memória para o armazenamento de informações. • Uso de variáveis globais (e estáticas); • Uso de variáveis locais; • Requisitando ao sistema, em tempo de execução, um espaço de um determinado tamanho. Existe enquanto o programa estiver sendo executado Existe enquanto a função estiver sendo executada. Espaço alocado dinamicamente. Distribuição do uso da memória Existe até que explicitamente seja liberado.
7. Funções da Biblioteca Padrão • Existem funções, presentes na biblioteca padrão stdlib, que permitem alocar e liberar memória dinamicamente. malloc Recebe como parâmetro o número de bytes que se deseja alocar e retorna o endereço inicial da área de memória alocada. int *v; v = malloc(10*4); int *v; v = malloc(10*sizeof(int)); ou Operador utilizado para independência de compiladores e máquinas.
8. Função Malloc • a função malloc é usada para alocar espaço para armazenarmos valores de qualquer tipo. Por este motivo, malloc retorna um ponteiro genérico, para um tipo qualquer, representado por void*. mas É comum fazermos a conversão explicitamente, utilizando o operador de molde de tipo (cast). int *v; v = (int*) malloc(10*sizeof(int));
9. Espaço de Memória • E se não houver espaço livre suficiente para realizar a alocação ? A função retorna um endereço nulo, representado pelo símbolo NULL Erro de Alocação!! Solução stdlib.h
10. Função Free • Para liberar um espaço de memória alocado dinamicamente, usamos a função free. Esta função recebe como parâmetro o ponteiro da memória a ser liberada. free (v) Atenção!! Só podemos passar para a função free um endereço de memória que tenha sido alocado dinamicamente. Não podemos acessar o espaço na memória depois que o liberamos.
12. Realocação de Memória • Como realocar memória ? E para que serve isso ?
CURSO DE C - 2010 FIM DA AULA 05: Vetores