Baixe o app para aproveitar ainda mais
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); }
Compartilhar