Buscar

Aula 11 e 12 Ponteiros Vetores e Estruturas de Dados sem alocacao dinamica

Prévia do material em texto

CIn.ufpe.br 
Computação Eletrônica 
 
Aula 11 – Ponteiros e Vetores 
 
Prof.: André Tiba 
akot@cin.ufpe.br 
Site da disciplina: www.cin.ufpe.br/~hfb/ce 
 
CIn.ufpe.br 
Tópicos da Aula 
• Hoje aprenderemos a manipular endereços de memória ou 
ponteiros, seguindo o seguinte roteiro: 
– Associação entre ponteiros e vetores 
CIn.ufpe.br 
Ponteiros e Vetores 
• Considere a declaração de um vetor: 
int v[10]; 
• O símbolo v: 
– Representa o vetor 
– É uma constante que representa seu endereço inicial 
– Aponta para o primeiro elemento do vetor 
CIn.ufpe.br 
Ponteiros e Vetores 
• Em C, existe um relacionamento muito forte entre ponteiros e 
vetores; 
– O compilador entende todo vetor e matriz como ponteiros, pois a 
maioria dos computadores é capaz de manipular ponteiros e não 
vetores; 
– Qualquer operação que possa ser feita com índices de um vetor pode 
ser feita com ponteiros; 
– O identificador de um vetor representa um endereço, ou seja, um 
ponteiro. 
CIn.ufpe.br 
Ponteiros e Vetores 
• Como vimos, C permite aritmética de ponteiros. 
• Se tivermos a declaração: 
 int v[10]; 
• Podemos acessar elementos do vetor através de aritmética de 
ponteiros; 
 v ou (v + 0): Aponta para o primeiro elemento do vetor; 
 v + 1: Aponta para o segundo elemento do vetor; 
 v + 9: Aponta para o último elemento do vetor; 
• Portanto: 
 &v[i] ↔ (v + i) 
 v[i] ↔ *(v + i) 
CIn.ufpe.br 
Ponteiros e Vetores 
• Vetores podem ser tratados como ponteiros em C! 
CIn.ufpe.br 
Ponteiros e Vetores 
• Vetores podem ser tratados como ponteiros em C! 
<-> 
Expressões equivalentes 
CIn.ufpe.br 
Ponteiros e Vetores 
• Vetores podem ser tratados como ponteiros em C! 
• Com notação de vetores: 
 
 
 
 
 
• Com notação de ponteiros: 
CIn.ufpe.br 
Ponteiros e Vetores 
• Observe o seguinte código: 
 
 
 
 
 
• Declaração de uma constante do tipo ponteiro para inteiros 
(ponteiro constante); 
• A expressão “nums++” tenta incrementar o endereço constante 
nums e atualizar a constante com novo endereço, o que é 
inválido. 
Errado! 
CIn.ufpe.br 
Ponteiros e Vetores 
• Observe o seguinte código: 
 
 
 
 
 
• Declaração de uma variável do tipo ponteiro para inteiros 
(ponteiro variável); 
• A expressão “pnums++” Incrementa endereço armazenado na 
variável pnums e atualiza a variável com novo endereço 
Correto! 
CIn.ufpe.br 
Alocação de Memória 
• Quando declaramos uma variável, o compilador reserva (aloca) 
um espaço na memória suficiente para armazenar valores do 
tipo da variável; 
• Alocação estática (em tempo de compilação): 
 
 
 
 
 
 
• E quando queremos alocar espaço dependendo de entradas 
fornecidas pelo usuário (em tempo de execução)? 
Aloca espaço para 1 int 
Aloca espaço para 10 char 
Aloca espaço para 1 endereço 
CIn.ufpe.br 
Alocação Estática vs Dinâmica 
• Modos de alocar espaço em memória: 
• Alocação estática: 
– Variáveis globais (e estáticas): O espaço reservado para a variável existe 
enquanto o programa estiver sendo executado 
– Variáveis locais: O espaço existe enquanto a função, que declarou a 
variável, estiver sendo executada. 
• Alocação dinâmica: 
– Requisitar memória em tempo de execução; 
– O espaço alocado dinamicamente permanece reservado até que seja 
explicitamente liberado pelo programa. 
CIn.ufpe.br 
Atividade 1 
• Faça um programa que calcula a média e o desvio padrão das 
notas de cinco alunos de uma turma; 
– O programa deve ter uma função “mediaDesvio” para calcular a média e 
o desvio padrão e retornar estes valores através de parâmetros passados 
por referência (ponteiros). 
– A função recebe como parâmetro o ponteiro para o vetor, a quantidade 
de elementos no vetor, e dois ponteiros: media e desvio onde deve 
guardar os resultados; 
 
CIn.ufpe.br 
Atividade 1 
CIn.ufpe.br 
Atividade 2 
• Faça um programa que imprime uma frase escrita pelo usuário. 
• Para isso, declare a dimensão de uma String de dimensão 50, e 
em seguida, peça para o usuário digitar a frase. 
• Construa uma função que imprima a frase digitada. Esta função 
deve ter como argumento apenas um ponteiro. 
CIn.ufpe.br 
Atividade 2 
CIn.ufpe.br 
Computação Eletrônica 
 
Aula 12 – Ponteiros e Estruturas de Dados 
sem alocação Dinâmica 
 
Prof.: André Tiba 
akot@cin.ufpe.br 
Site da disciplina: www.cin.ufpe.br/~hfb/ce 
 
CIn.ufpe.br 
Tópicos da Aula 
• Hoje aprenderemos a trabalhar com ponteiros para estruturas 
– Ponteiros para estruturas 
– Passagem por referência de estruturas 
– Vetores de estruturas x Vetores de ponteiros para estruturas 
• Aprenderemos também que existe outros formas de tipos 
estruturados em C: 
– Tipo União (Union) 
– Tipos Enumerados (Enum) 
CIn.ufpe.br 
Usando Ponteiro para Estruturas 
• Podemos ter variáveis do tipo ponteiro para estruturas: 
A variável p 
armazena o 
endereço de uma 
estrutura 
CIn.ufpe.br 
Acessando os Membros de 
Estruturas Através de Ponteiros 
• Os membros de uma estrutura são acessados usando seu nome 
seguido do operador ponto “.” 
• Podemos fazer o mesmo com ponteiros? 
? Errado! 
Quando queremos 
acessar os campos 
de uma estrutura 
através de um 
ponteiro, devemos 
utilizar o operador 
seta “->” 
CIn.ufpe.br 
Acessando os Membros de 
Estruturas Através de Ponteiros 
• Outra opção: 
– acessar o conteúdo apontado pelo ponteiro através do operador “*”, e, 
em seguida, 
– acessar o campo pretendido, utilizando o operador “.”: 
Os parênteses são 
necessários, para que o 
ponteiro p, seja 
convertido no conteúdo 
apontado pelo operador 
“*” 
Sem os parênteses 
o compilador 
entenderia como: 
*(p.x) - Errado! 
CIn.ufpe.br 
• Considere o exemplo: 
 
 
 
 
 
 
 
 
 
• A passagem de parâmetros está sendo feita por valor (ou por cópia), 
isto significa que a função lePonto não pode alterar o conteúdo da 
variável externa, p1! 
– Resposta: p1 = {0.0, 0.0} 
Passagem de Estruturas para 
Funções por Valor 
Supondo que o usuário 
tenha digitado: 
10.0 10.0 
Qual o valor de p1.x e 
p1.y após a execução de 
lePonto(p1)? 
CIn.ufpe.br 
• Esta cópia não é eficiente, pois consome mais memória e tempo 
para copiar. 
• Além disso, não permite que a variável externa seja alterada. 
• Para isso, existe a passagem de parâmetro por referência: 
 
 
 
 
 
 
 
 
Passagem de Estruturas para 
Funções por Referência 
O parâmetro p é 
declarado como ponteiro O acesso aos seus 
campos é realizado com 
a notação “->” 
É passado o endereço de p1 como 
parâmetro para “lePonto”. 
O conteúdo de p1 será alterado para os 
valores digitados pelo usuário 
CIn.ufpe.br 
• O tipo estruturado enum (enumeração) consiste de um 
conjunto de constantes inteiras, em que cada uma delas é 
representada por um nome; 
• Uma enumeração é uma forma mais elegante de organizar um 
conjunto de constantes; 
• Dá-se um contexto ao conjunto de constantes; 
• Uma variável de um tipo enumerado pode assumir qualquer 
valor listado na enumeração. 
Tipos Estruturado Enum 
CIn.ufpe.br 
• Forma geral: 
 
 
 
• Exemplo: 
 
 
 
• Internamente, o compilador atribui valores inteiros a cada 
constante seguindo a ordem em que elas são definidas, 
começando de 0, depois 1, etc. 
Definindo uma Enum 
DOMINGO == 0 
SEGUNDA == 1 
TERCA == 2 
... 
(DOMINGO < SEGUNDA): TRUE 
CIn.ufpe.br 
• Porém, o inteiro que representará cada constante pode ser 
definido pelo programador,se necessário: 
 
 
 
• Podem ser comparados como inteiros: 
Definindo uma Enum 
CIn.ufpe.br 
• Assim como uma struct, uma union agrupa um conjunto de 
tipos de dados (que podem ser distintos) sob um único nome; 
• Diferentemente de uma struct, uma union armazena valores 
heterogêneos em um mesmo espaço de memória; 
• Apenas um único membro de uma union pode estar 
armazenado em um determinado instante; 
• A atribuição a um membro da union sobrescreve o valor 
anteriormente atribuído a qualquer outro membro. 
• Utilidade: 
– Economia de memória 
– Praticidade de acessar uma mesma informação de formas (tipos) 
diferentes ou por partes; 
Tipo Estruturado Union 
CIn.ufpe.br 
• Forma geral: 
 
 
 
 
 
• Exemplo: 
Definindo uma Union 
CIn.ufpe.br 
Struct vs Union 
CIn.ufpe.br 
Manipulando uma Union 
• Definindo unions com typedef: 
 
 
Ou 
 
 
• Declarando uma union: 
 
• Acesso aos membros de uma union: 
– Diretamente ( Operador “ . ” ): 
 
– Via um ponteiro (Operador “ -> ” ): 
ou 
CIn.ufpe.br 
Cuidados com Union 
O que será 
impresso??? 
Após esta linha: 
num.inteiro = 70 
num.real = ????? 
num.str = ?????? 
Inteiro 70 interpretado como inteiro = 70 
Inteiro 70 interpretado como real = ??? 
Inteiro interpretado como String = ??? 
CIn.ufpe.br 
Atividade 2 
• Crie um programa que calcule a área e o perímetro de uma lista 
de 6 valores de raios que devem ser passados pelo usuário. 
• O programa deve imprimir o valor do raio, do perímetro e da 
área; 
– Defina um tipo chamado de ‘C’ que contenha essas três variáveis. Em 
seguida declare o um vetor de estruturas do tipo C. 
– Crie funções para calcular o perímetro e a área. Essas funções devem 
tem como entrada o raio e o endereço de memória do perímetro ou da 
área. 
CIn.ufpe.br 
Atividade 2 
CIn.ufpe.br 
Atividade 2 mod 
• Modifique o programa anterior de forma que haja uma só 
função que as funções retornem os valores da área e do 
perímetro, respectivamente. As funções tem como entrada o 
valor do raio. 
CIn.ufpe.br 
Atividade 2 mod 
CIn.ufpe.br 
Atividade 2 – mod 3 
• Reescreva a atividade 2, definindo vetores de dimensão 6, para 
raio, área e perímetro, dentro da estrutura do tipo ‘C’. 
• Declare uma variável e um ponteiro do tipo ‘C’, apontando esta 
variável para o ponteiro. 
• O programa deve imprimir o valor do raio, do perímetro e da 
área; 
– Defina um tipo chamado de ‘C’ que contenha essas três variáveis. Em 
seguida declare o um vetor de estruturas do tipo C. 
– Crie funções para calcular o perímetro e a área. Essas funções devem 
tem como entrada o raio e o endereço de memória do perímetro ou da 
área. 
CIn.ufpe.br 
Atividade 2 – mod 3 
CIn.ufpe.br 
Atividade 2 – mod 4 
• Reescreva a atividade 2, definindo vetores de dimensão 6, para 
raio, área e perímetro, dentro da estrutura do tipo ‘C’. 
• O programa deve imprimir o valor do raio, do perímetro e da 
área; 
– Defina um tipo chamado de ‘C’ que contenha essas três variáveis. Em 
seguida declare o um vetor de estruturas do tipo C. 
– Crie funções para calcular o perímetro e a área. Essas funções devem 
tem como entrada o raio e o endereço de memória do perímetro ou da 
área. 
CIn.ufpe.br 
Atividade 2 – mod 4

Continue navegando