Linguagem C Apontadores. Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica

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

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

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

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

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Reinaldo Gomes Alocação Dinâmica

Ponteiros e Alocação de Memória

Princípios de Desenvolvimento de Algoritmos MAC122

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

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

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

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

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

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

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

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

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

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

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

LINGUAGEM C: ALOCAÇÃO DINÂMICA

MC-102 Aula 19 Ponteiros II

Programação de Computadores II

Ponteiros. Introdução

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

Ponteiros. Baseado nos slides do Prof. Mauro.

10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Mestrado em Engenharia Física Tecnológica

Algoritmos e Estruturas de dados

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

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

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

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

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

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

Linguagem C Ponteiros

Estruturas de Dados. Profa. Juliana Pinheiro Campos

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

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

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

Aula 25: Alocação Dinâmica

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

Programação de Computadores II

Alocação Dinâmica em C

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

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

Laboratório de Programação II

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

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

1 Exercícios com ponteiros

DAS5102 Fundamentos da Estrutura da Informação

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

Estrutura de dados 1. Ponteiros

Alocação Dinâmica em C

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

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

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

quadrado(a)*0.5 -((a+2)*f(x,(1.0+n)/x)) Arquitectura de Computadores (2008/2009) - Linguagem C - Expressões 2

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

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

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

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

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

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

Fundamentos de Programação

LINGUAGEM C: PONTEIROS

Linguagem de Programação C. Ponteiros

Estruturas dinâmicas Ponteiros

Introdução à Computação

11a. Aula Ponteiros e Vetores

Tipos Abstratos de Dados. Estrutura de Dados

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

Aula 24 Ponteiros, vetores e structs

1 Exercícios com ponteiros

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

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

Ponteiros. Embora o programador não tenha acesso ao endereço de uma variável, existem algumas situações onde é necessário a utilização deste endereço.

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

5. Vetores e alocação dinâmica

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

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

Instituto Federal da Bahia Análise e Desenvolvimento de Sistemas INF029 Laboratório de Programação Aula 03: Ponteiros

Gilberto A. S. Segundo. 24 de agosto de 2011

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

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

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

ponteiros INF Programação I Prof. Roberto Azevedo

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

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

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

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

USP-ICMC-BInfo. Ponteiros em C. SCC501 - ICC-II 2011 Prof. João Luís

Estruturas Dinâmicas - Ponteiros

Transcrição:

Linguagem C Apontadores Endereços e apontadores Passagem de parâmetros para funções Apontadores e vectores Memória dinâmica

Endereços de Memória Podemos considerar a memória como um vector M, em que cada byte é acedido por M[i] i é o endereço do byte acedido Os endereços são números inteiros sem sinal Todos os dados (e código) são guardados na memória logo têm um endereço Em C podemos obter o endereço de uma variável usando o operador & int x; // &x -> corresponde ao endereço de x! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 2

Apontadores Em C podemos ter variáveis que guardam endereços (em vez de dados) Essas variáveis chamam-se apontadores Os apontadores apontam para tipos de dados específicos int x = 0; int *ap_int; //apontador para inteiros // * significa apontador ap_int = &x; //ap_int tem o endereço de x // diz-se que ap_int aponta para x! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 3

Na memória: Apontadores - memória Variável Endereço Valor 0x80101C?? x 0x801020 0 0x801024?? ap_int 0x801028 0x801020 0x80102C?? Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 4

Desreferenciação Através de um apontador podemos aceder à variável apontada A isto se chama desreferenciar o apontador É usado o operador * para desreferenciar o apontador int x; int * ap_int; ap_int = &x; *ap_int = -1; //desreferenciação de ap_int //o mesmo que fazer x = -1! // *ap_int passa a ser um aliás de x // uma nova designação para x! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 5

Desreferenciação (2) Na memória: Desreferen nciar Variável Endereço Valor 0x80101C?? x 0x801020-1 0x801024?? ap_int 0x801028 0x801020 0x80102C?? Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 6

Apontadores - propriedades Os apontadores são variáveis como as outras! Podemos atribuir valores entre apontadores char c, *ap1, *ap2; ap1 = &c; ap2 = ap1; // ap2 tem o endereço de c // *ap1 e *ap2 são aliases de c! Os valores dos apontadores são endereços de memória São números sem sinal! O seu tamanho corresponde ao número de bits para endereçar a memória - em sistemas de 32 bits temos sizeof(ap1) == 4 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 7

O apontador NULL A constante NULL (definida em stdlib.h) serve para indicar que o apontador não aponta para nenhum endereço válido O valor de NULL corresponde ao inteiro 0 Desreferenciar um apontador que vale NULL é um erro A consequência é o programa terminar com um erro de acesso à memória (segmentation fault ou bus error) if( ap_int!= NULL ) x = *ap_int; //podemos desreferenciar Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 8

Passagem de parâmetros - escalares Em C os parâmetros escalares são sempre passados por valor! Os valores são copiados para a função no momento da chamada Se quisermos ter parâmetros de saída temos que utilizar apontadores! Simulamos passagem de parâmetros por referência! void incrementar( int *x ) { (*x)++; } int i = 0; incrementar(&i); // o mesmo que i++ Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 9

Exemplo Troca (errado) void troca( int x, int y ) { int tmp = x; x = y; y = tmp; }... int a = 1, b = 2; troca( a, b ); printf( "a=%d b=%d\n", a, b ); Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 10

Exemplo Troca (errado) void troca( int x, int y ) { int tmp = x; x = y; y = tmp; }... int a = 1, b = 2; troca( a, b ); printf( "a=%d b=%d\n", a, b ); a=1 b=2 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 11

Exemplo Troca (certo) // solução usar apontadores void troca( int *x, int *y ) { } int tmp = *x; *x = *y; *y = tmp;... int a = 1, b = 2; troca( &a, &b ); printf( "a=%d b=%d\n", a, b ); Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 12

Exemplo Troca (certo) // solução usar apontadores void troca( int *x, int *y ) { } int tmp = *x; *x = *y; *y = tmp;... int a = 1, b = 2; troca( &a, &b ); printf( "a=%d b=%d\n", a, b ); a=2 b=1 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 13

Apontadores e vectores Em C um vector é um apontador constante para o seu primeiro elemento Um apontador pode apontar para um vector neste caso pode ser usado da mesma forma que o vector para aceder aos seus elementos O vector é um apontador constante não pode ser alterado para apontar para outra posição de memória Um apontador pode ser usado da mesma forma que um vector Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 14

Apontadores e vectores - semelhanças Para muitas utilizações as seguintes declarações têm o mesmo efeito: char *s1 = "xpto"; s é um apontador, inicializado com o endereço da string xpto, que ocupa 5 bytes char s2[] = "xpto"; s é um vector de 5 bytes, inicializado para conter a string xpto printf( "%s\n%s\n", s1, s2 ); printf( "%c\n%c\n", s1[1], s2[1] ); Repare que aqui não há diferença no uso de s1 e s2! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 15

Aritmética de apontadores Podemos somar inteiros a apontadores Somar n a um apontador corresponde a avançar n elementos no vector correspondente p[0] é o mesmo que *p Incrementar o apontador corresponde a fazê-lo apontar para a próxima posição do vector Pode ser utilizado para percorrer vectores corresponde a somar sizeof do tipo apontado ao valor númerico do apontador (endereço) Também podemos: Subtrair inteiros a apontadores Fazer a diferença (e comparação) entre apontadores Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 16

Aritmética de apontadores - exemplo int v[32]; int *p; v[16] = 1; v[17] = 2; p = v; // 16 = 0x10 // 17 = 0x11 //%p- mostrar valor do apontador (endereco) printf("%p\n", p); p += 16; printf("%p %d\n", p, *p); 0012FE00 p++; 0012FE40 1 printf("%p %d\n", p, *p); 0012FE44 2 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 17

Somar os elementos de um vector Somar todos os elementos de um vector #define MAX_VEC 5 int v[max_vec], *p, i; p = v; s = 0; for( i = 0; i < MAX_VEC; i++ ) { s += *p; p++; } Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 18

Somar os elementos de um vector int v[max_vec], *p, i; p = v; s = 0; for( i = 0; i < MAX_VEC; i++ ) { s += *p; p++; } 5 4 1 2 5 p?? i?? s?? Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 19

Somar os elementos de um vector int v[max_vec], *p, i; p = v; s = 0; for( i = 0; i < MAX_VEC; i++ ) { s += *p; p++; } 5 4 1 2 5 p i 0 s 0 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 20

Somar os elementos de um vector int v[max_vec], *p, i; p = v; s = 0; for( i = 0; i < MAX_VEC; i++ ) { s += *p; p++; } 5 4 1 2 5 p i 4 s 12 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 21

Somar os elementos de um vector int v[max_vec], *p, i; p = v; s = 0; for( i = 0; i < MAX_VEC; i++ ) { s += *p; p++; } 5 4 1 2 5 p i 5 s 17 Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 22

Passagem de parâmetros - vectores Quando uma função tem um parâmetro que é um vector esse parâmetro corresponde a um apontador! void f( char s[] ) É exactamente o mesmo que: void f( char *s ) Ou seja s é um apontador que vai apontar para o vector original com o qual foi chamada a função! Daí que os vectores em C sejam passados por referência! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 23

Passagem de vectores - exemplo void f( int v[] ) {... } int vec[100]; f( vec ); Quando f é chamada, o apontador v é inicializado para apontar para o primeiro elemento do vector vec Ao alterarmos os elementos de v, em f, estamos a alterar os elementos de vec! Repare que, em f, sizeof(v) é o tamanho da variável apontador v, não do vector vec! Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 24

Memória dinâmica - malloc É possível reservar memória para o programa sempre que necessário A função malloc reserva um bloco de memória dinâmica de n bytes e retorna um apontador para ele Retorna NULL se não houver memória suficiente // alocar espaço // para um vector de 100 inteiros int *v = malloc(100*sizeof(int)); // alocar espaço para a copia duma string s char *new_s = malloc(strlen(s)+1); // alocar espaço para uma estrutura s struct s *ps = malloc(sizeof(struct s)); Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 25

calloc, realloc e free calloc reserva espaço para um vector de n posições e inicializa tudo a zeros int *v = calloc(100,sizeof(int)); realloc altera o tamanho de um bloco de memória dinâmica O bloco pode ter ser movido na memória, pelo que realloc retorna o seu novo endereço v = realloc(v,200*sizeof(int)); free liberta um bloco de memória dinâmica free(v); // liberta memória alocada acima Protótipos destas funções estão em stdlib.h Arquitectura de Computadores (2008/2009) - Linguagem C - Apontadores 26

Free - avisos A função free liberta blocos de memória dinâmica Só serve para memória alocada por malloc (e calloc) nunca para vectores estáticos! free só pode ser usado uma vez para cada bloco Fazer free duas vezes do mesmo bloco tem consequências imprevisíveis Depois de fazer free é boa política por o apontador a NULL assim se evitam erros não detectados de acessos a posições de memória inválidas Arquitectura free(v); de Computadores (2008/2009) - Linguagem C - Apontadores 27