Estruturas Dinâmicas - Ponteiros

Documentos relacionados
Estruturas dinâmicas Ponteiros

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

Laboratório de Introdução à Ciência da Computação I

Estruturas Dinâmicas - Ponteiros Parte I

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Professor: Jó Ueyama Estagiário PAE: Heitor Freitas

Alocação Dinâmica. Introdução à Computação

Alocação Dinâmica em C

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Aula 17: Ponteiros e Alocação Dinâmica em C

Ponteiros. Introdução

Ponteiros. Introdução e Alocação Dinâmica

Funções em Linguagem C Parte II

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Princípios de Desenvolvimento de Algoritmos MAC122

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Aula 24 Ponteiros, vetores e structs

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estrutura de Dados. Aula 07 Alocação Dinâmica

DAS5102 Fundamentos da Estrutura da Informação

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Módulo 5 Vetores e Alocação Dinâmica

Linguagem C Ponteiros

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Programação. Cap. 12 Gestão de Memória Dinâmica

O que é um apontador em C (type pointer in C)?

Reinaldo Gomes Alocação Dinâmica

Modulo 12: alocação dinâmica de memória

Ponteiros. prof. Fabrício Olivetti de França

Métodos Computacionais. Vetores e Matrizes Dinâmicas

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Parte I. Introdução à Ciência da Computação I Modularização de Programas. SSC ICC1 Teórica

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

Ponteiros & tabelas (cont.) K&R: Capítulo 5

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Ponteiros e Alocação de Memória

INF 1007 Programação II

Curso de Programação C em Ambientes Linux Aula 05

Fundamentos de Programação

1 Exercícios com ponteiros

Ponteiros e Tabelas. K&R: Capítulo 5

Registros/Estruturas e Conjuntos

Introdução à Computação

Computação 2. Aula 7. Profª. Fabiany Ponteiros

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Alocação dinâmica de Memória

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

Ponteiros e Alocação Dinâmica em C. Fonte: DCC UFMT (modificado)

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

1 Exercícios com ponteiros

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

- Mapa de memória de um processo - Ponteiros

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Tipos Abstratos de Dados. Estrutura de Dados

1. Revisão de Vetores, Ponteiros, Funções e Estruturas em C

Linguagem C: Ponteiros - Alocação Dinâmica

ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10. A linguagem C/C++ possui recursos para alocação dinâmica de memoria.

Alocação Dinâmica de Memória - Exercício

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Tipos de Dados Simples (Continuação)

Ponteiros. Baseado nos slides do Prof. Mauro.

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Estruturas Dinâmicas - Ponteiros Parte IV

Aula 25: Alocação Dinâmica

Alocação Dinâmica de Memória. Programação II

Programação Estruturada

Referências. Programação de Computadores II. Cap. 6 Matrizes. Tópicos. Alocação Estática versus Dinâmica. Alocação Estática versus Dinâmica

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Algoritmos e Estruturas de Dados I (AEDI) Introdução - AEDI. Prof. Paulo Henrique Pisani

3. Linguagem de Programação C

Estrutura de Programas e Tipos de Dados Simples

Exercícios sobre textos; Alocação dinâmica.

Estrutura de dados 1. Ponteiros

Programação de Computadores II

Transcrição:

SSC0800 - ICC1 Teórica Introdução à Ciência da Computação I Estruturas Dinâmicas - Ponteiros Prof. Claudio Fabiano Motta Toledo: claudio@icmc.usp.br

Sumário Ponteiros Ponteiros e Vetores Funções para alocação de memória Vetor de ponteiros Matrizes e vetores de ponteiros 27/05/2011 2

Ponteiros Uma variável é armazenada em um certo número de bytes em uma determinada posição de memória. Um ponteiro é uma variável que contém o endereço de outra variável. Ponteiros são usados para acessar e manipular conteúdos em determinado endereço de memória. 27/05/2011 3

Ponteiros Acesso ao endereço de memória da variável: &<nome_var> Declaração de um ponteiro: <tipo> *<nome_var_ponteiro> Exemplos de declaração de ponteiros: int *p; char *q; float *r,*s; 27/05/2011 4

Ponteiros O operador unário * representa indireção ou deferenciação. Se p é um ponteiro, então *p é o valor da variável da qual p é o endereço. O valor direto de p é o endereço de memória. *p é o valor indireto de p, pois representa o valor armazenado no endereço de memória. 27/05/2011 5

Ponteiros int a=1, b=2, *p; a b p 1 2 p=&a a b p 1 2 b = *p; b=a; a 1 b 2 1 p 27/05/2011 6

Exemplo: #include <stdio.h> #include <stdlib.h> int main() { } int i=7, *p = &i; Ponteiros printf("%s%d\n%s%p\n", " Valor de i: ", *p, return 0; "Endereco de i:", p); Valor de i: 7 Endereco de i: 0028FF18 27/05/2011 7

Ponteiros Declaração e inicialização int i=3, j = 5, *p = &i, *q=&j, *r; double x; Expressão Expressão Equivalente Valor p == & i p == (&i) 1 * * & p * ( * (& p) ) 3 r = & x r = (& x) /* ilegal*/ 7 * * p / * q + 7 ( ( (7 * (* p) ) ) / (* q) ) +7 11 * ( r = & j) *= * p (* (r = (& j) ) ) *= (* p) 15 Cuidado: (7 * * p / * q + 7) (7 * * p / * q + 7) 27/05/2011 8

Ponteiros Uma declaração void * <nome_ptr> cria um ponteiro do tipo genérico. Conversões durante atribuição entre ponteiros diferentes normalmente eram permitidas no C tradicional. Porém, conversões de tipo envolvendo ponteiro não são permitidas no padrão ANSI C. No ANSIC, a conversão ocorre apenas se um dos tipos é um ponteiro void ou o lado direito é uma constante 0. 27/05/2011 9

Ponteiros Declaração int *p; float *q; void *v; Permitido Não permitido p=0; p = 1; p = (int *) 1; v = 1; p = v = q; p = q; p = (int *) q; 27/05/2011 10

Ponteiros e Vetores Um ponteiro pode acessar diferentes endereços. Uma determinada posição em um vetor é um endereço ou um ponteiro que está fixo. Considere o vetor a[ ], onde a aponta para a posição i=0. Temos que: a[ i ] *(a + i) Considere o ponteiro p, também temos que: p[ i ] *(p + i) 27/05/2011 11

Ponteiros e Vetores Incrementando/decremento de ponteiros int vet[100], *p_vet; p_vet = vet; p_vet++; // aponta para o próximo elemento do vetor p_vet--; // aponta para o elemento anterior do vetor p_vet += 4; //aponta para a posição atual do vetor + 4; 27/05/2011 12

Ponteiros e Vetores int vet[] = {10,11,12,13}, *p_vet, cnt; p_vet = vet; for(cnt=0; cnt<3; cnt++){ printf("\n %d", *p_vet++); } p_vet = vet; for(cnt=0; cnt<3; cnt++){ printf("\n %d", *++p_vet); } Qual a diferença do resultado impresso pelos dois printf? 27/05/2011 13

Ponteiros e Vetores Considere as declarações abaixo: # define N 100 int a[n], i, *p, sum=0; Temos que: p = a p=&a[0]; p = a+1 p=&a[1]; Suponha que a[n] tenha sido inicializado. As rotinas abaixo são equivalentes p=a; for (p=a; p < & a[n]; ++p) for (i=0; i < N; ++i) for (i=0; i < N; ++i) sum += *p; sum += *(a+i); sum += p[ i ]; 27/05/2011 14

Ponteiros e Vetores No exemplo anterior, o vetor a[n] tem o identificador a como um ponteiro constante. Logo, as expressões abaixo são ilegais: a = p ++a a+=2 &a Não é possível mudar o valor de a. 27/05/2011 15

Ponteiros e Vetores Podemos passar parte de um vetor para uma função, passando um apontador para o início do subvetor. func(&a[4]) func(a+4) A declaração dentro da função func() pode ser: func(int vet[ ]){...} ou func(int *vet) {...} Desde que os limites do vetor sejam obedecidos, pode-se utilizar indexação invertida. vet[-1], vet[-2], vet[-3],... 27/05/2011 16

Funções para alocação de memória malloc(), calloc(), realloc(), free() São funções utilizadas para trabalhar com alocação dinâmica (em tempo de execução) de memória A memória é alocada a partir de uma área conhecida como heap 27/05/2011 17

Malloc //void *malloc(size_t size); size = tamanho do bloco de memória em bytes size_t é um tipo pré-definido usado em stdlib.h que faz size_t ser equivalente ao tipo unsigned int. Retorna um ponteiro para o bloco de memória alocado Quando não conseguir alocar a memória, retorna um ponteiro nulo A região alocada contém valores desconhecidos Sempre verifique o valor de retorno! 27/05/2011 18

Malloc #include <stdlib.h> type-casting: void2char char *str; if((str = (char *)malloc(100)) == NULL) { printf("espaco insuficiente para alocar buffer \n"); exit(1); } printf("espaco alocado para str\n"); 27/05/2011 19

Malloc #include <stdlib.h> int *num; if((num = (int *)malloc(50 * sizeof(int))) ==NULL) { printf("espaco insuficiente para alocar buffer \n"); exit(1); } printf("espaco alocado para num\n"); 27/05/2011 20

Calloc //void * calloc ( size_t num, size_t size ); A função calloc() aloca um bloco de memória para um array de num elementos, sendo cada elemento de tamanho size A região da memória alocada é inicializada com o valor zero A função retorna um ponteiro para o primeiro byte Se não houver alocação, retorna um ponteiro nulo 27/05/2011 21

#include <stdlib.h> Calloc unsigned int num; int *ptr; printf("digite o numero de variaveis do tipo int: "); scanf("%d", &num); if((ptr = (int *)calloc(num, sizeof(int))) == NULL) { printf("espaco insuficiente para alocar \ num\ \n"); exit(1); } printf("espaco alocado com o calloc\n"); 27/05/2011 22

Malloc x Calloc calloc(n, sizeof(int)); malloc(n*sizeof(int));] A função malloc() não inicializa o espaço disponibilizado em memória. A função calloc() inicializa com valor zero. Em programas extensos, malloc() pode levar menos tempo do que calloc(). As duas funções retornam um ponteiro do tipo void * em caso de sucesso. Caso contrário, NULL é retornado. 27/05/2011 23

Realloc //void * realloc (void * ptr, size_t size ); A função realloc() aumenta ou reduz o tamanho de um bloco de memória previamente alocado com malloc() ou calloc() O argumento ptr aponta para o bloco original de memória e o size indica o novo tamanho desejado em bytes 27/05/2011 24

Realloc Possíveis retornos: Se houver espaço para expandir, a memória adicional é alocada e retorna ptr Se não houver espaço suficiente para expandir o bloco atual, um novo bloco de tamanho size é alocado numa outra região da memória e o conteúdo do bloco original é copiado para o novo. O espaço de memória do bloco original é liberado e a função retorna um ponteiro para o novo bloco 27/05/2011 25

Realloc Possíveis retornos (continuação): Se o argumento size for zero, a memória indicada por ptr é liberada e a função retorna NULL Se não houver memória suficiente para a realocação (nem para um novo bloco), a função retorna NULL e o bloco original permanece inalterado Se o argumento ptr for NULL, a função atua como um malloc() 27/05/2011 26

Exemplo: calloc seguido de realloc unsigned int num; int *ptr; printf("digite o numero de variaveis do tipo int: "); scanf("%d", &num); if((ptr = (int *)calloc(num, sizeof(int))) == NULL){ printf("espaco insuficiente para alocar \"num\" \n"); exit(1); } //duplica o tamanho da região alocada para ptr if((ptr = (int *)realloc(ptr, 2*num*sizeof(int))) == NULL){ printf("espaco insuficiente para alocar \"num\" \n"); exit(1); } printf("novo espaço \ realocado\ com sucesso\n"); 27/05/2011 27

//void free ( void * ptr ); Free O espaço alocado dinamicamente com calloc() ou malloc() não retorna ao sistema quando o fluxo de execução deixa uma função. A função free() desaloca /libera um espaço de memória previamente alocado usando malloc, calloc ou realloc, tornando-o disponível para uso futuro 27/05/2011 28

//void free ( void * ptr ); Free A função deixa o valor de ptr inalterado, porém apontando para uma região inválida (note que o ponteiro não se torna NULL) Se for passado um ponteiro nulo, nenhuma ação será realizada. Ex: free(ptr); 27/05/2011 29

Vetor de ponteiros O exemplo a seguir ilustra a inicialização de um vetor de ponteiros. Também é considerada uma função que retorna ponteiro e o uso de um vetor static. Suponha que uma função deva retornar um apontador para uma cadeia de caracteres contendo o nome do n-ésimo mês. 27/05/2011 30

char *nome_mes(int n){ Vetor de ponteiros static char *nome[]={ "Mes ilegal", "janeiro", "fevereiro", "marco", "abril","maio","junho","julho","agosto", "setembro","outubro","novembro","dezembro" }; } return (n<1 n>12)? nome[0]:nome[n]; 27/05/2011 31

Matrizes e vetores de ponteiros O identificador a é um vetor bidimensional com espaço alocado para 30 caracteres inicializado da seguinte forma: { { a, b, c, :, \0 }, { a,, i, s,, f, o, r,...} } a[0] = { a, b, c, :, \0 } a[0] e a[1] são cadeias de caracteres (strings) Apenas 5 elementos estão especificados em a[0], mas há espaço alocado para 15 caracteres. Os demais elementos são iniciados com valor zero (caractere do tipo null). Devido à alocação de espaço, qualquer das 30 posições pode ser acessada fazendo a[ i ][ j ]. 27/05/2011 32

Matrizes e vetores de ponteiros O identificador p representa um vetor de ponteiros para char. A declaração de p aloca espaço para dois ponteiros. O ponteiro p[0] é iniciado apontando para a cadeia de caracteres abc: que requer 5 espaços do tipo char. p 0 a b c \0 1 a i s f o r a p p l e \0 27/05/2011 33

Matrizes e vetores de ponteiros p trabalha com menos espaço do que a. Observe que a[0][14] é uma posição válida, mas p[0][14] não. As cadeias de caracteres apontadas por p[0] e p[1] não podem ser modificadas, pois p[0] e p[1] são cadeias de caracteres constantes. As cadeias de caracteres de a[0] e a[1] podem ser alteradas. 27/05/2011 34

Matrizes e vetores de ponteiros Indireção múltipla ou ponteiros para ponteiros ocorre quando temos ponteiro apontando para outro ponteiro que aponta para determinado valor. Ptr1 Endereço Variável valor Indireção simples Ptr1 Endereço Ptr2 Endereço Variável valor Indireção múltipla 27/05/2011 35

Matrizes e vetores de ponteiros #include <stdio.h> int main(void){ int x, *p, **q; x=10; p=&x; q=&p; printf("%d",**q); return 0; } Um ponteiro para um ponteiro deve ser declarado com a adição de mais um *. int **q; **q Indica que q é um ponteiro para um ponteiro do tipo int. acessa o valor apontado pelos ponteiros. 27/05/2011 36

Matrizes e vetores de ponteiros #include <stdio.h> #include <stdlib.h> double *alocandovetor(int *); double *liberandovetor(int, float *); void main (void) { double *vetor; int tam; vetor = alocandovetor (&tam); printf("tam=%d",tam); vetor = liberandovetor(tam, vetor); } 27/05/2011 37

double *alocandovetor(int *tam) { } double *vet; do{ printf ("\ntamanho do vetor:"); scanf("%d",*tam); }while(*tam<1); vet = (double *) calloc (*tam, sizeof(double)); if (!vet) { printf ("\nespaço em Memoria Insuficiente\n"); return (NULL); } return (vet); double *liberandovetor(int tam, float *vet) { } if (!vet) return (NULL); free(vet); return (NULL); 27/05/2011 38

Matrizes e vetores de ponteiros #include <stdio.h> #include <stdlib.h> double **alocandomatriz (int *, int *); float **liberandomatriz(int, int, float **); void main (void) { float **matriz; /* matriz a ser alocada */ int ln, cl; /* numero de linhas e colunas da matriz */ matriz = alocandomatriz(&ln, &cl); matriz = liberandomatriz(ln, cl, matriz); } 27/05/2011 39

double **alocandomatriz (int* linhas, int* colunas) { int i; double **mat; //Recebendo num. de linhas e colunas do{ printf("num. linhas="); scanf("%d",linhas); }while(linhas<1); do{ printf("num. colunas="); scanf("%d",colunas); }while(colunas<1); 27/05/2011 40

//Alocação das linhas mat = (double **) calloc (*linhas, sizeof(double *)); if (!mat) { printf ("\nespaço em Memoria Insuficiente\n"); return (NULL); } //Alocação das colunas for ( i = 0; i < *linhas; i++ ) { mat[i] = (double*) calloc (*colunas, sizeof(double)); if (!mat[i]) { printf ("Espaço em Memoria Insuficiente"); return (NULL); } } return (mat); } 27/05/2011 41

float **liberandomatriz(int linhas, int colunas, float **mat) { int i; if (!mat) return (NULL); //Liberando as linhas da matriz for (i=0; i<linhas; i++) free (mat[i]); //Liberando a matriz free (mat); return (NULL); } 27/05/2011 42

Exercício I Escreva um programa que: Inicia uma matriz 20x20 com valores aleatórios no intervalo [10,-10]. Determina o maior e o menor valor dessa matriz. Determina a quantidade de valores negativos dessa matriz. Funções devem ser utilizada para cada tarefa. Ponteiros devem ser utilizados sempre que possível. 27/05/2011 43

Referências Ascencio AFG, Campos EAV. Fundamentos de programação de computadores. São Paulo : Pearson Prentice Hall, 2006. 385 p. Kelley, A.; Pohl, I., A Book on C: programming in C. 4ª Edição. Massachusetts: Pearson, 2010, 726p. Kernighan, B.W.; Ritchie, D.M. C, A Linguagem de Programação: padrão ANSI. 2ª Edição. Rio de Janeiro: Campus, 1989, 290p. 27/05/2011 44

FIM Aula 14