ESTUDO DE CASO
Dissertações: ESTUDO DE CASO. Pesquise 862.000+ trabalhos acadêmicosPor: deehreis2 • 6/6/2013 • 1.160 Palavras (5 Páginas) • 404 Visualizações
Universidade de São Paulo – São Carlos
Instituto de Ciências Matemáticas e de Computação
Alocação Dinâmica em C
Profa Rosana Braga
Adaptado de material preparado pela profa
Silvana Maria Affonso de Lara
1º semestre de 2010
2
Roteiro da Aula
Alocação Dinâmica de Memória
Vetores e alocação dinâmica
Alocação da memória principal
Funções para alocar e liberar memória
Alocação dinâmica de matrizes
3
Vetores e alocação dinâmica
A forma mais simples de estruturarmos um
conjunto de dados é por meio de vetores
Definimos um vetor em C da seguinte forma:
int v[10];
Esta declaração diz que v é um vetor de inteiros
dimensionado com 10 elementos, isto é,
reservamos um espaço de memória contínuo para
armazenar 10 valores inteiros. Assim, se cada int
ocupa 4 bytes, a declaração reserva um espaço de
memória de 40 bytes
4
O acesso a cada elemento do vetor é feito
através de uma indexação da variável v .
Em C, a indexação de um vetor varia de zero a
n-1, onde n representa a dimensão do vetor.
v[0] acessa o primeiro elemento de v
v[1] acessa o segundo elemento de v ...
Mas v[10] invade a memória
104
144
v
Vetores e alocação dinâmica
5
Vetores e alocação dinâmica
float v[10];
int i;
/* leitura dos valores */
for (i = 0; i < 10; i++)
scanf("%f", &v[i] );
Se v[i] representa o (i+1)-ésimo elemento do vetor, &v[i]
representa o endereço de memória onde esse elemento está
armazenado
Existe uma associação entre vetores e ponteiros, pois a
variável v , que representa o vetor, é uma constante que
armazena o endereço inicial do vetor, isto é, v , sem indexação,
aponta para o primeiro elemento do vetor.
Observe que passamos para scanf
o endereço de cada
elemento do vetor ( &v[i] ), pois
desejamos que os valores
capturados sejam armazenados
nos elementos do vetor.
6
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
Portanto, escrever &v[i] é equivalente a escrever (v+i)
De maneira análoga, escrever v[i] é equivalente a escrever
*(v+i) (é lógico que a forma indexada é mais clara e adequada)
Note que o uso da aritmética de ponteiros aqui é perfeitamente
válido, pois os elementos dos vetores são armazenados de
forma contínua na memória
Vetores e alocação dinâmica
7
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. Assim, se
passarmos para uma função um vetor de int , devemos ter
um parâmetro do tipo int* , capaz de armazenar endereços
de inteiros
Salientamos que a expressão “passar um vetor para uma
função” deve ser interpretada como “passar o endereço inicial
do vetor”. Os elementos do vetor não são copiados para a
função, o argumento copiado é apenas o endereço do
primeiro elemento.
Vetores e alocação dinâmica
8
/* Incrementa elementos de um vetor */
#include <stdio.h>
void incr_vetor ( int n, int *v ) {
int i;
for (i = 0; i < n; i++)
v[i]++;
}
int main ( void ) {
int a[ ] = {1, 3, 5};
incr_vetor(3, a);
printf("%d %d %d \n", a[0], a[1], a[2]);
return
...