Buscar

Computação Básica - Ponteiros

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
COMPUTAÇÃO BÁSICA
Ponteiros
Prof. Bruno Macchiavello (bruno@cic.unb.br)
Universidade de Brasília – UnB 
Instituto de Ciências Exatas – IE 
Departamento de Ciência da Computação – CIC 
Prof. Bruno Macchiavello 1
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Ponteiros
• Ponteiro é uma variável que contém o endereço de uma
outra variável.
• Daí o nome, pois ele aponta para outra variável.
Endereço na 
memória
Conteúdo
Prof. Bruno Macchiavello 2
memória
1000 1003
1001
1002
1003 34
1004
1005
1006
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Ponteiros
• Alguns usos:
� Alocação dinâmica de memória.
� Manipulação de vetores e matrizes, incluindo� Manipulação de vetores e matrizes, incluindo
strings.
� Acessar variáveis, vetores, matrizes e structs
que não são visíveis a uma função.
� Retornar mais de um valor de uma função.
Prof. Bruno Macchiavello 3
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Declaração
• Declaração de variáveis ponteiros:
� tipo *nome
• Operadores de Ponteiros
� Existem dois operadores especiais para
ponteiros:
� &
� *
Prof. Bruno Macchiavello 4
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *p, x;int *p, x;
x = 15;
p = &x;
printf("%d \n", p);
return 0;
}
Prof. Bruno Macchiavello 5
& � Pode ser lido 
como “o endereço 
de”
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *p, q, x;
x = 15;
p = &x;
q = *p;
printf("%d \n", p);
printf("%d \n", *p);
printf("%d \n", q);
return 0;
}
Prof. Bruno Macchiavello 6
* � Pode ser lido 
como “o valor que 
esta sendo 
apontado”
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int *p1, *p2, x, y, z;
x = 10;
p1 = &x;
p2 = p1;
printf("x: %d \n", x);
printf("&x: %d \n", &x);
Exemplo 2
printf("&x: %d \n", &x);
printf("p1: %d \n", p1);
printf("&p1: %d \n", &p1);
printf("p2: %d \n", p2);
printf("&p2: %d \n", &p2);
y = *p1;
printf(“y: %d \n", y);
z = *p2;
printf(“z: %d \n", z);
return 1;
}
Prof. Bruno Macchiavello 7
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Vetor de Ponteiros
#include <stdio.h>
#define MAX 2
int main (int argc, char *argv[])
{
int *x[MAX], var1, var2;
var1 = 3;
var2 = 4;
x[0] = &var1;
x[1] = &var2;
printf("&var1: %d \n", &var1);
printf("&var2: %d \n", &var2);
printf("var1: %d\n", var1);
printf("var2: % d\n", var2);
printf("x[0]: %d \n", x[0]);
printf("x[1]: %d \n", x[1]);
printf("*x[0]: %d\n", *x[0]);
printf("*x[1]: % d\n", *x[1]);
return 1;
}
Prof. Bruno Macchiavello 8
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Aritmética de Ponteiros
� Existem duas operações possíveis com
ponteiros:
o Adição; e
o Subtração.
Prof. Bruno Macchiavello 9
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Aritmética de Ponteiros
� Consideremos p1 um ponteiro para um inteiro com
valor atual 2000. Assuma, também, que os inteiros
são de 4 bytes.
� Após a expressão p1++, p1 contém 2004.
� Cada vez que p1 é incrementado, ele aponta para o
próximo inteiro.
� O mesmo é verdade nos decrementos.
� Ou seja, ponteiros incrementam ou decrementam
pelo tamanho do tipo de dado que eles apontam.
Prof. Bruno Macchiavello 10
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo 3 
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int *p1, x = 10;;
p1 = &x;
printf("p1: %d \n", p1);printf("p1: %d \n", p1);
printf(“&x: %d \n", &x);
printf("x: %d \n", x);
p1++;
printf("p1: %d \n", p1);
printf(“&x: %d \n", &x);
printf("x: %d \n", x);
return(1);
}
Prof. Bruno Macchiavello 11
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Exemplo 4
#include <stdio.h>
int main (int argc, char *argv[])
{ 
double *p1, x = 1.23212345;
p1 = &x; 
printf("p1: %d \n", p1);
printf("&x: %d \n", &x);
printf("x: %lf \n", x);
p1 = p1 + 2;
printf("p1: %d \n", p1);
printf("&x: %d \n", &x);
printf("x: %lf \n", x);
return(1);
}
Prof. Bruno Macchiavello 12
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Vetores
• Ao criar um vetor o compilador reserva um espaço 
determinado de memória e cria um ponteiro.
#include <stdio.h>
#define MAX 4
int main (int argc, char *argv[])
{
int i, x[MAX] = {0,1,2,3};
Prof. Bruno Macchiavello 13
printf("Endereco\t Conteudo\t \n");
printf("Notacao de vetor:\n");
for (i=0; i<MAX; i++)
printf("%d\t\t %d\t \n", &x[i], x[i]);
printf(“Notacao de ponteiro:\n");
for (i=0; i<MAX; i++)
printf("%d\t\t %d\t \n", x+i, *(x+i));
return(1);
}
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Ponteiros e Scanf
int i, *pi;
pi = &i;
A função scanf pede como argumento um ponteiro.
Prof. Bruno Macchiavello 14
pi = &i;
scanf(“%d”, &i); /* é equivalente a */
scanf(“%d”, pi); /* note que não é &pi */
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação Dinâmica de Memória
• A alocação dinâmica permite ao programador alocar
memória para variáveis quando o programa está sendo
executado.
• É possível criar um vetor ou matriz cujo tamanho
somente será definido em tempo de execução.somente será definido em tempo de execução.
• O padrão C ANSI define apenas 4 funções para o
sistema de alocação dinâmica, disponíveis na biblioteca
stdlib.h:
� malloc(): aloca memória
� calloc(): aloca memória e inicia com zeros
� realloc(): redimensiona o tamanho da memória alocada.
� free(): libera memória alocada
Prof. Bruno Macchiavello 15
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocando com MALLOC
• A função malloc() possui o seguinte protótipo:
void *malloc (unsigned int num);
• A função malloc() lê a quantidade num bytes a
alocar, reserva a memória correspondente eretornaalocar, reserva a memória correspondente e retorna
o endereço do primeiro byte alocado.
• O tipo *void permite a alocação de qualquer tipo de
ponteiro.
• Se não houver memória disponível para alocar, a
função retorna um ponteiro nulo (NULL).
Prof. Bruno Macchiavello 16
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocando com MALLOC
• Exemplo de alocação para 30 valores do tipo
double:
double * pd;
pd = (double *) malloc(30 * sizeof(double));
• A operação realizada com o (double *) é chamada
de casting. Ela converte o tipo retornado pela
função malloc() de ponteiro para void em ponteiro
para double.
• Note que pd é declarada com ponteiro para um
simples double e não para um bloco de 30 doubles.
Prof. Bruno Macchiavello 17
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Liberando Memória
• A função free() recebe como argumento um endereço
previamente alocado com malloc() e libera a memória
alocada.
• Para cada alocação, realizar uma liberação
correspondente, de modo que a memória possa ser
reutilizada.reutilizada.
• Protótipo da função:
void free(void *ptr);
• Exemplo de uso:
free(pd);
Prof. Bruno Macchiavello 18
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Redimensionando
• realloc() redimensiona a memória de forma não 
destrutiva.
double * pd;
pd = (double *) malloc(30 * sizeof(double));
pd = realloc(pd, 40 * sizeof(double));
Prof. Bruno Macchiavello 19
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
#include <stdio.h>
#include <stdlib.h> /* para malloc() e free() */
int main(){
double * pd;
int max, numero, i = 0;
printf("Qual tamanho do vetor de doubles?\n");
scanf("%d", &max);
pd = (double *) malloc(max * sizeof (double));
if (pd == NULL){
printf("Falhou alocacao. Finalizando.\n");
return(0); /*pode ser utilizado o comando exit */
}
while(i<max)
{
printf("Digite o valor %d do vetor:\n“, i+1);
scanf(“%lf”, pd+i);
}
/* resto do código */
free(pd);
return(1);
}
Prof. Bruno Macchiavello 20
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação com CALLOC
• Alocando 100 espaços de memória do tamanho 
long (4 bytes).
long * nm;
nm = (long *)calloc(100, sizeof (long));
• Inicia todos os elementos com bits 0.
• Memória pode ser liberada com free().
Prof. Bruno Macchiavello 21
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação de Matrizes
• A alocação dinâmica de arrays
multidimensionais é feito utilizando as funções
de manipulação de memória apresentadas.
• Pode ser feitas de DUAS maneiras:• Pode ser feitas de DUAS maneiras:
�Utilizando UM ponteiro e fazendo a matriz na
LÓGICA do programa.
�Ou utilizando ponteiros para ponteiros.
Prof. Bruno Macchiavello 22
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação de Matrizes
• Por exemplo vamos alocar memória para uma matriz de 
tamanha 20x30 de inteiros.
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{ 
int i,j, *mat;
Prof. Bruno Macchiavello 23
int i,j, *mat;
mat = (int*)malloc(20*30*sizeof(int));
for (i=0;i<20;i++)
for(j=0;j<30;j++)
{
printf("\nDigite o valor [%d][%d] da matriz:",i,j);
scanf("%d",mat+(i*30)+j);
printf("\nVoce digitou: %d",*(mat+(i*30)+j));
}
free(mat); 
return(1);
}
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação de Matrizes
• Usando ponteiro para ponteiro
Prof. Bruno Macchiavello 24
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação
Universidade Universidade de de BrasíliaBrasília
Computação BásicaComputação Básica
Alocação de Matrizes
• Vamos alocar memória para uma matriz de tamanha 
20x30 de inteiros (utilizando ponteiro para ponteiro).
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{ 
int i,j, **mat;
mat = (int**)malloc(2*sizeof(int));
Prof. Bruno Macchiavello 25
for (i=0;i<2;i++)
mat[i] = (int*)malloc(3*sizeof(int));
for (i=0;i<2;i++)
for(j=0;j<3;j++)
{
printf("\nDigite o valor [%d][%d] da matriz:",i,j);
scanf("%d",&mat[i][j]);
printf("\nVoce digitou: %d",mat[i][j]);
}
for (i=0;i<2;i++)
free(mat[i]);
free(mat); 
return(1);
}

Outros materiais