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