• Nenhum resultado encontrado

Aulas Ponteiros

N/A
N/A
Protected

Academic year: 2021

Share "Aulas Ponteiros"

Copied!
78
0
0

Texto

(1)

PROGRAMAÇÃO DE

COMPUTADORES I

Prof. Filipe Nunes Ribeiro

(2)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

MEMÓRIA

A memória é formada

por várias células.

Cada célula contém

um endereço e um

valor.

O tamanho do

endereço e o tamanho

do valor dependem da

arquitetura do

computador (32/64

bits)

(3)

MEMÓRIA

Declaração um

caractere chamado i .

Os caracteres ocupam

1 byte na memória

(para uma arquitetura

de 32 bits)

(4)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

MEMÓRIA

Declaração um

número inteiro

chamado i .

Os inteiros ocupam 4

bytes na memória

(para uma arquitetura

de 32 bits)

(5)

MEMÓRIA

Declaração de um

número ponto flutuante

chamado i .

Os pontos flutuantes

ocupam 4 bytes na

memória (para uma

arquitetura de 32 bits)

(6)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

MEMÓRIA

Declaração de um

número ponto flutuante

de dupla precisão

chamado i .

Os pontos flutuantes de

dupla precisão ocupam

8 bytes na memória

(para uma arquitetura

de 32 bits)

(7)

PONTEIROS

Como funciona o scanf?

Como é atribuído o valor digitado a uma variável que

é de um tipo primitivo?

(8)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS

Como funciona o scanf?

(9)

PONTEIROS

Como funciona o scanf?

(10)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS

Algumas utilidades de ponteiros:

Fornecem os meios pelos quais as funções podem

modificar seus argumentos

Permitem passagem de parâmetros por referência.

Possibilitam alocação dinâmica de memória.

Aumentam a eficiência.

(11)

PONTEIROS

O que são?

Um ponteiro é uma variável que contém um endereço

de memória.

Esse endereço é normalmente a posição de uma

outra variável na memória.

Se uma variável contém o endereço de uma outra,

então a primeira variável é dita como ponteiro para

segunda.

(12)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS

Sintaxe para declaração:

<tipo> * <nome_variável>;

Exemplo que declara uma variável ptr que é um

ponteiro para um inteiro:

(13)

PONTEIROS

(14)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

ALOCAÇÃO

Declaração de quatro ponteiros(c, i , f e d).

Cada ponteiro de um tipo diferente(char, int,

float, double)

Todos eles ocupam o mesmo espaço na

memória, 4 bytes

Isso acontece porque todos eles armazenam

endereços de memória, e o tamanho de um

endereço de memória é o mesmo para todos

os tipos.

(15)

ALOCAÇÃO

(16)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

ALOCAÇÃO

Declaração de um inteiro i

A variável i recebe o valor 15. Esse valor 15

e colocado no campo valor da memória

alocada previamente para a variável

Lembrem que essa notação com o 15 na

ultima casa e apenas didática na verdade os

valores são binários.

(17)

ALOCAÇÃO

A variável c do tipo char é criada e

(18)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

ALOCAÇÃO

Ponteiro de inteiro declarado.

O nome desse ponteiro é p e ele é

inicializada no momento de sua criação.

O valor que esse ponteiro recebe e o

endereço da variável i(&i) que nesse

caso é o endereço 00000000

(19)

ALOCAÇÃO

Finalizando, fazemos uma atribuição.

Colocamos 25 no valor apontado por

p. Como visto no slide anterior p

aponta para i

Desse modo, colocamos 25 no valor

(20)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

ENDEREÇOS

Ao declararmos uma variável x como acima, temos

associados a ela os seguintes elementos:

Um nome (x)

Um endereço de memória ou referência (ex:

0xbfd267c4)

Um valor (100)

Para acessarmos o endereço de uma variável,

(21)

ENDEREÇOS

Um ponteiro (apontador ou pointer) é um tipo

especial de variável cujo valor é um endereço.

Um ponteiro pode ter o valor especial NULL,

quando não contém nenhum endereço.

NULL e uma constante definida na biblioteca

(22)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

ENDEREÇOS

A expressão acima representa o conteúdo do

endereço de memória guardado na variável var.

Ou seja, var não guarda um valor, mas sim um

(23)

O OPERADOR ADDRESS-OF (&)

Retorna o endereço de uma variável

Aparece na tela:

O valor de x = 100

(24)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIRO

Um apontador é uma variável que pode armazenar

(25)

PONTEIROS

Aparece na tela:

valor de x = 100

(26)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

(27)

DECLARAÇÃO DE PONTEIROS

Ha vários tipos de ponteiros:

ponteiros para caracteres

ponteiros para inteiros

ponteiros para ponteiros para inteiros

ponteiros para vetores

ponteiros para estruturas

O compilador C faz questão de saber de que tipo de

(28)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

DECLARAÇÃO DE PONTEIROS

Utiliza-se o operador unário*

(29)

EXEMPLOS DE UTILIZAÇÃO DE PONTEIROS

Atribuição de ponteiros para ponteiros inteiros

(30)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

EXEMPLOS DE UTILIZAÇÃO DE PONTEIROS

Atribuição de ponteiros para ponteiros inteiros

(31)

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

Um ponteiro sempre deve apontar para o tipo de

dado correto. Caso contrário, podem ocorrer erros

durante a execução do programa.

O trecho de código (apresentado na página 115 do

livro “C Completo e Total”) a seguir apresenta erro

de lógica porque um ponteiro aponta para um tipo

incorreto.

(32)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

(33)

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

(34)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

Warning apresentado ao compilar o

código no Dev C++. Um warning

não impede que o programa seja

compilado.

(35)

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

(36)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

Execução do código com a mudança do

ponteiro para o tipo char.

(37)

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

E se substituirmos o ponteiro de inteiro para um

(38)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM ATRIBUIÇÃO DE

PONTEIROS

E se substituirmos o ponteiro de inteiro para um

(39)

PROBLEMAS COM PONTEIROS

Atribuição de um valor diretamente a um ponteiro

(40)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM PONTEIROS

Atribuição de um valor diretamente a um ponteiro

(41)

PROBLEMAS COM PONTEIROS

Atribuição de um valor diretamente a um ponteiro

(42)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PROBLEMAS COM PONTEIROS

Atribuição de um valor diretamente a um ponteiro

Vamos tentar mudar o valor da posição referenciada por ptr2

(43)

Atribuição de uma referência a um valor de um

ponteiro

PROBLEMAS COM PONTEIROS

2293620 é conversão de 0022FF74 de

Hexadecimal para decimal

(44)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

COMPARAÇÃO ENTRE PONTEIROS

É possível comparar ponteiros em uma expressão

relacional

>

<

==

>=

<=

(45)

Os ponteiros podem

ser comparados

entre si

Repare que os if`s e

eles`s estão

organizados em

escada sem a

necessidade de

abertura de chaves

para cada else

(46)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

(47)

PONTEIROS E STRINGS

Já vimos que a definição de uma variável de um tipo

primitivo é diferente de um array

Quando declaramos um array de double por exemplo,

alocamos um espaço contíguo na memória do tamanho de

elementos multiplicado pelo tamanho de bytes ocupado

por aquele tipo

(48)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

O mesmo acontece para strings

A variável que representa uma String é um ponteiro para

a primeira posição do array na memória

Pergunta

(49)

PONTEIROS E STRINGS

O mesmo acontece para strings

A variável que representa uma String é um ponteiro para

a primeira posição do array na memória

Pergunta

(50)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

Exemplo de execução

(51)
(52)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

Pergunta

(53)

PONTEIROS E STRINGS

Pergunta

Será que o código abaixo compila?

(54)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

Pergunta

Será que o código abaixo compila?

Ocorrerá erro de

execução.

Ao inicializar uma

string como no caso

da variável array, ela é

armazenada na tabela

de strings criada pelo

compilador para

armazenar as

constantes strings

utilizadas pelo

programa. Logo, a

string inicializada não

pode ser modificada.

(55)

PONTEIROS E STRINGS

Pergunta

(56)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

E agora? Funciona?

(57)

PONTEIROS E STRINGS

E agora? Funciona?

A variável array3 agora

aponta para o endereço

do conteúdo do array2

(58)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

E agora? Funciona?

Lembrando que as linhas de código

marcado não copiam o conteúdo das

strings. Eles apenas fazem com que

array e array3 apontem para o

(59)

PONTEIROS E STRINGS

E agora? Funciona?

(60)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

Erros ao manipular strings

Erro 1 – Agora funciona

Funciona porque ponteiro p foi inicializado e

está apontando para a primeira posição do

vetor str2.

(61)

Erros ao manipular strings

Erro 2

PONTEIROS E STRINGS

ERRO: o ponteiro p não foi inicializado.

(62)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PONTEIROS E STRINGS

Função gets

scanf(...);

getchar();

gets(...);

Atenção: Usar a função gets após o uso da função

scanf causa um erro de lógica. O comando enter

('quebra de linha') usado para terminar a leitura de

scanf fica armazenada no buffer e é lido diretamente

pela função gets. Para evitar esse problema,

podemos chamar a função getchar(); para obter o

retorno de carro, esvaziando o buffer. Exemplo

abaixo

puts: método que escreve uma

String no stdout (stantard output)

no caso o monitor.

(63)

USO DO CONST EM PONTEIROS

O ponteiro ptr não pode ser modificado

O seguinte trecho de código cria um ponteiro

constante para um valor constante

(64)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

USO DO CONST EM PONTEIROS

O valor apontado pelo ponteiro ptr não pode ser

modificado

(65)

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

(66)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

(67)

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

(68)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

Arrays – quando declaramos arrays estamos

declarando ponteiros. Certo?

Então posso receber um array como parâmetro de

um método da forma abaixo?

(69)

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

Arrays – quando declaramos arrays estamos

declarando ponteiros. Certo?

Então posso receber um array como parâmetro de

um método da forma abaixo?

(70)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

Exemplo 1

Método que recebe uma string e exibe seus elementos

com um espaço entre eles

(71)

Exemplo

(72)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

Exemplo 2

Criação de funções para o cálculo do tamanho de uma

string

(73)

Critério de parada! Importante: Funciona

para o array de caracteres apenas.

(74)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

E se quisermos passar como referência um array de

inteiros?

Em geral passamos como parâmetro além do ponteiro a

quantidade de elementos presentes no array.

(75)

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

(76)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

PASSAGEM DE PARÂMETROS POR

REFERÊNCIA

(77)

Teste – 21/01

Faça um programa que receba a temperatura média de

cada mês do ano, armazenando-as em um vetor.

Calcule e mostre a maior e a menor temperatura do

ano e em que mês (por extenso) ocorreram.

Desconsidere empates.

Dica 1: Use uma variável menor_temp para armazenar

a menor temperatura. Comece inicializando-a com a

temperatura no primeiro mês. A fim de determinar o

mês em que ocorreu a menor temperatura, use uma

variável pos_menor_temp para armazenar a posição

em que a menor temperatura foi encontrada no

vetor. Obviamente o seu valor inicial deve ser zero.

(78)

Universidade Federal de Ouro Preto Campus João Monlevade

Instituto de Ciências Exatas e Aplicadas

REFERÊNCIAS

Notas de Aula do Professor Romildo Malaquias

(DECOM/UFOP)

Notas de Aula do Professor Giori Ambrósio

Referências

Documentos relacionados

A Figura 2 mostra a fração volumétrica do lastro limpo, após a troca de 3 volumes de tanque de lastro, em um plano transversal localizado na região central do tanque e,

1 Tampa do reservatório do travão dianteiro Front brake reservoir cover 2 Tampa do reservatório da embraiagem Clutch reservoir

calloc retorna um ponteiro para um array com n elementos de tamanho size cada um ou NULL se não houver memória disponível. Os

Em prematuros mais ECR são necessários tanto como modo de suporte NI primário quanto após extubação. Principalmente para se avaliar a eficácia e segurança do uso de CAF em

em prata e ouro português estilo Art Déco, cravejado com ametista em talhe retangular e 2 diamantes em talhe rosa, séc. XX/XIX,

•   O  material  a  seguir  consiste  de  adaptações  e  extensões  dos  originais  gentilmente  cedidos  pelo 

Mesmo quando o Inversor estiver protegido por um ou mais dos componentes da String Box (fusíveis e/ou DPS) internamente a ele, é valido e aconselhado usar igualmente uma

• Structs são coleções de dados heterogêneos agrupados em um mesmo elemento de dados. • Ex: armazenar as coordenadas (x,y) de um