Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ponteiro
Varivel que guarda um endereo de memria. Varivel que guarda endereo de outra varivel. til para acessar regies especficas na memria. Declarao: int *pnum; pnum o nome do ponteiro e "int *" diz ao compilador que pnum guardar um endereo de memria onde ser armazenado um inteiro
Exemplo
int num = 2; // varivel inteira de nome num int *pontNum; // ponteiro para um inteiro int *pont2; // ponteiro para um inteiro pontNum = # // atribui endereo da varivel num em pontNum printf("%d \n",*pontNum); // imprime 2 *pontNum = 8; printf("%d \n",*pontNum); // imprime 8 num = 10; printf("%d \n",*pontNum); // imprime 10 pont2 = pontNum; *pont2 = *pont2 + 3; printf("%d \n",*pontNum); // imprime 13 printf("%d \n",*pont2); // imprime 13
MC102 Profa.Wanessa Machado do Amaral - 1s2010
Importante
No confunda! Se fizermos: *p2 = *p1; estamos copiando o contedo da regio de memria apontada por p1 para a regio de memria apontada por p2. J se fizermos: p2 = p1; estaremos fazendo p2 apontar para a mesma regio de memria apontada por p1.
Exerccio
Suponha que os endereos das variveis a, b e c so 1000, 1004 e 1008 respectivamente. float a, b; float c, *pa, *pb; a = 0.001; b = 0.003; pa = &a; *pa = 2 * a; pb = &b; c = 3 * (*pa + *pb); Quais os valores de: (a) pa (b) *pa (c) pb (d) c
Resposta
Valores de: (a) pa = 1000 (b) *pa = 0.002 (c) pb = 1004 (d) c = 0.015
MC 102 Algoritmos e programao de computadores Profa. Wanessa Machado do Amaral Aula 24 Alocao dinmica
Alocao dinmica
Imagine o seguinte problema. Voc precisa de um vetor de mdias de alunos, mas no sabe previamente quantos alunos ter, ou seja, quantos elementos tem o seu vetor. Uma soluo seria declarar um vetor grande o suficiente: float medias[999]; Mas isso poderia significar um desperdcio muito grande de memria, alm de correr o risco de alocar espao insuficiente. Com alocao dinmica: float *medias = (float*)malloc(n * sizeof(float));
MC102 Profa.Wanessa Machado do Amaral - 1s2010
Alocao dinmica
A alocao dinmica o processo que aloca memria em tempo de execuo. utilizada quando no se sabe ao certo quanto de memria ser necessrio para o armazenamento das informaes, podendo ser determinadas em tempo de execuo conforme a necessidade do programa. Evita-se desperdcio de memria. Existem 4 funes para alocaes dinmica pertencentes a biblioteca stdlib.h : malloc(), calloc(), realloc() e free().
Alocao dinmica
Para alocar memria para uma varivel qualquer, utiliza-se o comando sizeof: double *n; n = (double *)malloc(sizeof(double)); Para alocar memria para um vetor de double, com n posies: double *v; // vetor de notas v = (double *)malloc(n * sizeof(double)); Onde n um inteiro que representa quantas posies ter o vetor v.
MC102 Profa.Wanessa Machado do Amaral - 1s2010
Comando Calloc
Quero alocar espao para 5 inteiros. Com calloc eu fao: int *p; p = (int *)calloc(5,sizeof(int)); Com malloc eu fao: int *p; p = (int *)malloc(5 * sizeof(int)); Nos dois casos o espao reservado o mesmo "em tamanho", no necessariamente alocam o mesmo endereo. A diferena nesse caso seria o contedo que com calloc seria zerado. Zerar o contedo serve para descobrir se algum elemento no foi preenchido, por exemplo.
MC102 Profa.Wanessa Machado do Amaral - 1s2010
// aloca as linhas da matriz v = (float **) calloc (m, sizeof(float *)); // aloca as colunas da matriz for ( i = 0; i < m; i++ ) { v[i] = (float*) calloc (n, sizeof(float)); }
Comando realloc
A funo realloc faz um bloco j alocado crescer ou diminuir, preservando o contedo j existente: vetor = (int*) realloc (vetor, n * sizeof(int));
Comando free
A funo free libera o espao alocado: float *medias; // vetor de medias medias = (float*)malloc(n*sizeof(float)); free(medias); Nunca esquea de usar free no trmino do uso da varivel, para liberar a memria alocada.