Anda di halaman 1dari 21

MC 102 Algoritmos e programao de computadores Profa.

Wanessa Machado do Amaral Aula 24 Ponteiros

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

MC102 Profa.Wanessa Machado do Amaral - 1s2010

Atribuir valor ao ponteiro


Existem dois operadores unitrios que so utilizados com ponteiros: (*) - retorna o valor da varivel que est localizada no ponteiro (&) - retorna o endereo de memria em que est localizada a variavel do ponteiro. preciso decorar: & de endereo! * para valor!

MC102 Profa.Wanessa Machado do Amaral - 1s2010

Atribuir valor ao ponteiro


Quando fazemos printf("%d",*p); estamos imprimindo o valor do dado que est na regio de memria apontada por p. J se fizermos: printf("%d",p); Estaremos imprimindo o endereo de memria para onde p aponta.
MC102 Profa.Wanessa Machado do Amaral - 1s2010

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.

MC102 Profa.Wanessa Machado do Amaral - 1s2010

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

MC102 Profa.Wanessa Machado do Amaral - 1s2010

Resposta
Valores de: (a) pa = 1000 (b) *pa = 0.002 (c) pb = 1004 (d) c = 0.015

MC102 Profa.Wanessa Machado do Amaral - 1s2010

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().

MC102 Profa.Wanessa Machado do Amaral - 1s2010

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

Alocao dinmica de um vetor float


Exemplo: #include<stdio.h> main (){ float *medias; // vetor de medias int n; // nmero de elementos do vetor printf("Qual o nmero de alunos? "); scanf("%d",&n); medias = (float*)malloc(n*sizeof(float)); medias[0]=9.5; printf("%f", medias[0]); system("PAUSE"); }
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

Alocao dinmica de matriz


float **v; int i; // ponteiro para a matriz // variavel auxiliar

// 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)); }

MC102 Profa.Wanessa Machado do Amaral - 1s2010

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.

MC102 Profa.Wanessa Machado do Amaral - 1s2010

Retornando um ponteiro em uma funo


float *alocarVetorReal(int n) { float *v; v = (float *) calloc (n, sizeof(float)); if (v == NULL) { printf ("Erro ao alocar"); return (NULL); } return (v); // retorna ponteiro para o v } float *p; int a = 10; p = alocarVetorReal (a);
MC102 Profa.Wanessa Machado do Amaral - 1s2010

Alocar dinamicamente um vetor de struct


Dada a seguinte struct: struct Contato{ char nome[100]; int telefone; }; Declarar um ponteiro para a struct: struct Contato *agenda; Alocar espao na memria para o vetor: agenda = (struct Contato *)malloc(sizeof(struct Contato)*n);
MC102 Profa.Wanessa Machado do Amaral - 1s2010

Alocar dinamicamente um vetor de caracteres


Sabemos que uma string um vetor de caracteres. Para alocar uma string de forma dinmica, usa-se a seguinte sintaxe: char *letras; letras = (char *)malloc(sizeof(char)*10); letras[0]='a'; printf("%c ", letras[0]); Com a sintaxe acima alocamos espao na memria para armazenar uma palavra de 10 caracteres.
MC102 Profa.Wanessa Machado do Amaral - 1s2010

Alocar dinamicamente uma matriz de caracteres


Por outro lado, para armazenar um vetor de strings, temos que armazenar na verdade uma matriz de letras, onde cada linha representa uma palavra ou frase. A sintaxe para alocao dinmica de matriz de caracteres a seguinte: char **palavras; // aloca as linhas da matriz (vetor de palavras) palavras = (char **) malloc (10 * sizeof(char *)); // aloca as colunas da matriz (letras de cada palavra) for ( i = 0; i < 10; i++ ) { palavras[i] = (char*) malloc (20 * sizeof(char)); } strcpy(palavras[0],"Ana Maria"); printf("%s ", palavras[0]);
MC102 Profa.Wanessa Machado do Amaral - 1s2010

Anda mungkin juga menyukai