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

Documentos relacionados
Mestrado em Engenharia Física Tecnológica

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

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

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

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

LINGUAGEM C: ALOCAÇÃO DINÂMICA

13 a Aula - Instruções Condicionais. Ciclos. Pré-processador. Variáveis de ambiente. Mestrado em Engenharia Física Tecnológica

Alocação Dinâmica em C

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

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

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

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

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

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

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

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

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

Ponteiros. Baseado nos slides do Prof. Mauro.

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

Mestrado em Engenharia Física Tecnológica

LINGUAGEM C: PONTEIROS

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

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

Mestrado em Engenharia Física Tecnológica

Princípios de Desenvolvimento de Algoritmos MAC122

Algoritmos e Programação

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

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

Programação: Vetores

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

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

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Programação I Matrizes e Strings. Prof. Carlos Alberto

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

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

Fundamentos de Programação

Declarando e Utilizando Ponteiros. Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável;

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Aula 4: Introdução à Linguagem C++

Laboratório de Programação II

5 a Aula - Funções de Intervalo (II). Ciclo for. Leitura e Escrita em Ficheiros. Mestrado em Engenharia Física Tecnológica

Introdução a Programação de Jogos

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

Aula 24 Ponteiros, vetores e structs

É o asterisco (*) que faz o compilador saber que aquela variável não vai guardar um valor e sim um endereço para aquele tipo especificado.

Aula 25: Alocação Dinâmica

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

3 a Aula - Ciclos. Leitura de Dados. Funções de Intervalo (I). Mestrado em Engenharia Física Tecnológica

Matrizes. Estruturas de Dados Aula 5: Matrizes. Vetor declaração estática. Vetor declaração dinâmica

Estruturas de Dados Aula 5: Matrizes 23/03/2011

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

Estruturas de Dados Aula 5: Matrizes

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 2

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

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

1 Exercícios com ponteiros

Introdução a Ponteiros e Vetores em C

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

Fundamentos de Programação

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

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

Mestrado em Engenharia Física Tecnológica

3. Linguagem de Programação C

Java Variáveis e Controle Fluxo

Ponteiros e Alocação de Memória

Estruturas dinâmicas Ponteiros

Algoritmos e Programação

Introdução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI

Algoritmos e Estruturas de dados

Introdução à Computação

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

Tipos Abstratos de Dados. Estrutura de Dados

Aula 26: Estruturas heterogêneas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Aula 02. Prof. Diemesleno Souza Carvalho

Vetores e Strings. 6. Comandos de entrada e saída formatada que trabalham sobre strings

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

Laboratório de Programação II

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Ponteiros, ponteiros e vetores e alocação dinâmica de memória

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

Ponteiros. Introdução

Linguagem C Princípios Básicos (parte 1)

ANHANGUERA ESTRUTURA DE DADOS AULA 04 MATRIZES, LISTAS E ALOCAÇÃO DINÂMICA. Prof. Thomás da Costa

1 Exercícios com ponteiros

11 - Estrutura de um programa em C

Linguagem C: Ponteiros. Prof. Tiago Alves de Oliveira

Linguagem de Programação III

Algoritmos e Estruturas de Dados I. Passagem de Parâmetros. Pedro O.S. Vaz de Melo

Linguagem C: Ponteiros. Prof. Leonardo Barreto Campos 1

Transcrição:

10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Programação Mestrado em Engenharia Física Tecnológica Samuel M. Eleutério sme@tecnico.ulisboa.pt Departamento de Física Instituto Superior Técnico Universidade de Lisboa

Operadores de molde ( casting ) Já vimos, mais de uma vez, como se utilizam os operadores de molde (casting): eles permitiram-nos fazer conversões entre tipos compatíveis. Usámo-los, por exemplo, para gerar números aleatórios no intervalo [0,1], isto é, converter inteiros em reais. No entanto, há um outro papel muito importante por eles desempenhado. Vamos ver nos pontos seguintes como se usa o ponteiro void * quando ainda não se sabe o tipo para que irá apontar. Mas chega sempre o momento em que o tipo tem de ser especificado e, nessa altura, devemos usar o operador respectivo para atribuir o tipo correcto. Nos pontos seguintes vão mostrar-se situações que exigem a sua utilização.

Atribuição de Memória ( Prog12 01.c ) Um operador particularmente importante para gestão de memória é o operador: sizeof (nome do tipo); ele retorna o comprimento, em bytes, do tipo pedido. Nota: os parêntesis só são obrigatórios se o argumento for o nome de um tipo. Falaremos disso mais tarde. Admitamos que necessitamos de guardar reais num vector mas não sabemos à partida qual o seu comprimento. Que fazemos? Podemos fazer, como anteriormente, sobredimensionar o vector e muito provavelmente não ter memória suficiente ou Podemos criá-lo quando necessário e com o tamanho exigido. Para tal usamos a função malloc: void *malloc (size t size);

Atribuição de Memória (II) ( Prog12 02/3.c e Prog08 11.c [ver 08 07]) Se quisermos criar um vector de 50 doubles, declaramos um ponteiro para double, reservamos (alloc) o espaço de memória desejado e apontamos para lá o ponteiro: double *p ; p = (double *) malloc (50 * sizeof (double)); Se desejarmos alterar o espaço de memória atribuído a um ponteiro, podemos fazê-lo usando a função realloc: void *realloc (void *ptr, size t size); Assim, se desejarmos alterar o seu tamanho de 50 para 70: p = (double *) realloc (p, 70 * sizeof (double)); Finalmente, existe uma outra função que liberta o espaço reservado pela aplicação das funções malloc ou realloc. Essa função chama-se free: void free (void *ptr);

Ponteiros ( Prog18 01.c ) Em C todas as variáveis podem ser encaradas de dois pontos de vista diferentes: Pelo seu endereço, isto é, pela sua localização na memória; Pelo seu valor. As variáveis que guardam a localização na memória do espaço atribuído às variáveis (endereço) chamam-se ponteiros. Quando declaramos um ponteiro, declaramos também o tipo de variável para o qual estamos a apontar (tipo *nome;). Exemplos: double a, *p, *x, y, *q, z ; Se há ponteiros, então também deverão existir ponteiros que apontam para ponteiros!: double **r ; e assim sucessivamente... double ***s, int ****v, etc..

Ponteiros (II) Ao utilizar variáveis dimensionadas (Ex: char cnome[80];), a variável assim declarada ( cnome ) é um ponteiro para o início da zona de memória que lhe está reservada (neste caso, 80 bytes). As variáveis dimensionadas podem ser inicializadas no momento em que são definidas. Quando um vector é inicializado o número de elementos dele é o número de elementos indicado. Então não há necessidade de o explicitar: double t[ ] = {1., 2., 3., 4., 5., 6.}; mas não é válido escrever simplesmente double t[ ];. Ao fazermos a declaração para objectos de maiores dimensões (matrizes, etc.), podemos escrever: int m[ ][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; em que o último [3] indica que os valores, na matriz, deverão estar agrupados em linhas de 3 colunas.

Ponteiros (III) Acontece, por vezes, que precisamos de apontar para objectos de que não sabemos ainda o tipo. Para isso foi criado o tipo void *. Um ponteiro void * pode assumir o valor dum ponteiro de qualquer outro tipo, e, inversamente, pode ser atribuído a qualquer outro ponteiro. Resta agora saber que operações são permitidas sobre ponteiros. Vejamos quais os operadores específicos que sobre eles actuam: Operador de referência ( & ): quando aplicado a uma variável fornece o seu endereço na memória; Operador de derreferência ( * ): quando aplicado a um ponteiro retorna o valor guardado na sua zona de memória; Operador de derreferência para estruturas ( -> ): retorna o valor do elemento da estrutura indicado;

Ponteiros (IV) ( Prog18 02.c ) Para além dos operadores atrás referidos são possíveis as operações de soma e subtração. Se somarmos a um ponteiro 1, isso significa que avançamos de um número de bytes correspondentes ao espaço ocupado por um elemento do tipo considerado. E, se for n : *(p+n) p[n] ou, inversamente, &p[n] p+n Se, por exemplo, quisermos ler o valor de v[2], usando a função scanf, podemos escrever: scanf ( %f, &(v[2])); scanf( %f, v+2); São válidas as operações com ++,, +=, =. Actualmente, na maioria dos sistemas os ponteiros usam 8 bytes, embora em sistemas mais antigos ainda se usem 4 bytes.

Conjuntos Enumerados de Inteiros ( Prog13 01.c ) Quando que deseja utilizar listas de valores inteiros aos quais se deseja associa um nome, é cómoda a utilização de enumerados. Os enumerados declaram-se listando nomes separados por vírgulas. Se não se derem mais indicações, o primeiro toma o valor 0 e os valores crescem de 1 em 1. No entanto, podemos dar designações diferentes ao mesmo valor. Nesses casos é necessário especificá-lo explicitamente. Note-se que ao atribuirmos explicitamente um valor, o valor seguinte será o seu valor mais 1, mesmo que a ordem inicial seja com isso alterada. Os enumerados podem ser usados conjuntamente com os inteiros. Embora alguns compiladores não o exijam, é conveniente usar sempre o molde (casting) apropriado.