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.