You are on page 1of 21

MC 102 – Algoritmos e programação de computadores Profa.

Wanessa Machado do Amaral Aula 24 – Ponteiros

Ponteiro
Variável que guarda um endereço de memória. Variável que guarda endereço de outra variável. É útil para acessar regiões específicas na memória. Declaração: int *pnum; pnum é o nome do ponteiro e "int *" diz ao compilador que pnum guardará um endereço de memória onde será armazenado um inteiro

MC102 – Profa.Wanessa Machado do Amaral - 1s2010

Wanessa Machado do Amaral .1s2010 .retorna o valor da variável que está localizada no ponteiro (&) . É preciso decorar: & de endereço! * para valor! MC102 – Profa.Atribuir valor ao ponteiro Existem dois operadores unitários que são utilizados com ponteiros: (*) .retorna o endereço de memória em que está localizada a variavel do ponteiro.

p).Atribuir valor ao ponteiro Quando fazemos printf("%d".*p).1s2010 . Estaremos imprimindo o endereço de memória para onde p aponta. Já se fizermos: printf("%d". estamos imprimindo o valor do dado que está na região de memória apontada por p.Wanessa Machado do Amaral . MC102 – Profa.

// imprime 13 MC102 – Profa. // ponteiro para um inteiro int *pont2. printf("%d \n". // imprime 2 *pontNum = 8.*pontNum). // imprime 8 num = 10.1s2010 . *pont2 = *pont2 + 3. // imprime 10 pont2 = pontNum. // atribui endereço da variável num em pontNum printf("%d \n". // ponteiro para um inteiro pontNum = &num. // imprime 13 printf("%d \n".Wanessa Machado do Amaral .*pont2).*pontNum).*pontNum). printf("%d \n".*pontNum). printf("%d \n". // variável inteira de nome num int *pontNum.Exemplo int num = 2.

Wanessa Machado do Amaral .Importante Não confunda! Se fizermos: *p2 = *p1. estamos copiando o conteúdo da região de memória apontada por p1 para a região de memória apontada por p2. estaremos fazendo p2 apontar para a mesma região de memória apontada por p1.1s2010 . MC102 – Profa. Já se fizermos: p2 = p1.

1s2010 . b e c são 1000.Wanessa Machado do Amaral . Quais os valores de: (a) pa (b) *pa (c) pb (d) c MC102 – Profa. *pb. b = 0. *pa = 2 * a. c = 3 * (*pa + *pb). float c. pb = &b.001. b. float a. pa = &a. a = 0.Exercício Suponha que os endereços das variáveis a. 1004 e 1008 respectivamente. *pa.003.

002 (c) pb = 1004 (d) c = 0.Resposta Valores de: (a) pa = 1000 (b) *pa = 0.1s2010 .Wanessa Machado do Amaral .015 MC102 – Profa.

MC 102 – Algoritmos e programação de computadores Profa. Wanessa Machado do Amaral Aula 24 – Alocação dinâmica .

quantos elementos tem o seu vetor. ou seja. Uma solução seria declarar um vetor grande o suficiente: float medias[999].1s2010 . Mas isso poderia significar um desperdício muito grande de memória.Wanessa Machado do Amaral .Alocação dinâmica Imagine o seguinte problema. MC102 – Profa. Você precisa de um vetor de médias de alunos. Com alocação dinâmica: float *medias = (float*)malloc(n * sizeof(float)). além de correr o risco de alocar espaço insuficiente. mas não sabe previamente quantos alunos terá.

Wanessa Machado do Amaral .h : malloc(). podendo ser determinadas em tempo de execução conforme a necessidade do programa.1s2010 .Alocação dinâmica A alocação dinâmica é o processo que aloca memória em tempo de execução. É utilizada quando não se sabe ao certo quanto de memória será necessário para o armazenamento das informações. MC102 – Profa. Existem 4 funções para alocações dinâmica pertencentes a biblioteca stdlib. Evita-se desperdício de memória. calloc(). realloc() e free().

Alocação dinâmica Para alocar memória para uma variável qualquer.Wanessa Machado do Amaral . utiliza-se o comando sizeof: double *n.1s2010 . MC102 – Profa. Onde n é um inteiro que representa quantas posições terá o vetor v. n = (double *)malloc(sizeof(double)). Para alocar memória para um vetor de double. com n posições: double *v. // vetor de notas v = (double *)malloc(n * sizeof(double)).

printf("%f".Alocação dinâmica de um vetor float Exemplo: #include<stdio. medias = (float*)malloc(n*sizeof(float)).Wanessa Machado do Amaral .1s2010 . } MC102 – Profa. medias[0]). medias[0]=9.&n). // vetor de medias int n.5. scanf("%d". system("PAUSE"). // número de elementos do vetor printf("Qual o número de alunos? ").h> main (){ float *medias.

p = (int *)calloc(5. não necessariamente alocam o mesmo endereço.Comando Calloc Quero alocar espaço para 5 inteiros.sizeof(int)). Com calloc eu faço: int *p. Nos dois casos o espaço reservado é o mesmo "em tamanho". Com malloc eu faço: int *p. p = (int *)malloc(5 * sizeof(int)). MC102 – Profa.1s2010 . por exemplo. Zerar o conteúdo serve para descobrir se algum elemento não foi preenchido. A diferença nesse caso seria o conteúdo que com calloc seria zerado.Wanessa Machado do Amaral .

// aloca as colunas da matriz for ( i = 0.Wanessa Machado do Amaral . i < m. int i. // ponteiro para a matriz // variavel auxiliar // aloca as linhas da matriz v = (float **) calloc (m. } MC102 – Profa.1s2010 . sizeof(float)).Alocação dinâmica de matriz float **v. i++ ) { v[i] = (float*) calloc (n. sizeof(float *)).

n * sizeof(int)).Comando realloc A função realloc faz um bloco já alocado crescer ou diminuir. . preservando o conteúdo já existente: vetor = (int*) realloc (vetor.

free(medias).1s2010 .Comando free A função free libera o espaço alocado: float *medias. // vetor de medias medias = (float*)malloc(n*sizeof(float)). Nunca esqueça de usar free no término do uso da variável. MC102 – Profa. para liberar a memória alocada.Wanessa Machado do Amaral .

v = (float *) calloc (n.1s2010 . } return (v). sizeof(float)). MC102 – Profa. // retorna ponteiro para o v } float *p. if (v == NULL) { printf ("Erro ao alocar").Retornando um ponteiro em uma função float *alocarVetorReal(int n) { float *v. return (NULL).Wanessa Machado do Amaral . int a = 10. p = alocarVetorReal (a).

1s2010 . MC102 – Profa.Alocar dinamicamente um vetor de struct Dada a seguinte struct: struct Contato{ char nome[100].Wanessa Machado do Amaral . }. int telefone. Alocar espaço na memória para o vetor: agenda = (struct Contato *)malloc(sizeof(struct Contato)*n). Declarar um ponteiro para a struct: struct Contato *agenda.

Para alocar uma string de forma dinâmica. Com a sintaxe acima alocamos espaço na memória para armazenar uma palavra de 10 caracteres. letras[0]='a'. printf("%c ".Wanessa Machado do Amaral .Alocar dinamicamente um vetor de caracteres Sabemos que uma string é um vetor de caracteres. MC102 – Profa.1s2010 . letras = (char *)malloc(sizeof(char)*10). usa-se a seguinte sintaxe: char *letras. letras[0]).

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