PROGRAMAÇÃO DE
COMPUTADORES I
Prof. Filipe Nunes Ribeiro
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)
MEMÓRIA
Declaração um
caractere chamado i .
Os caracteres ocupam
1 byte na memória
(para uma arquitetura
de 32 bits)
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)
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)
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)
PONTEIROS
Como funciona o scanf?
Como é atribuído o valor digitado a uma variável que
é de um tipo primitivo?
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PONTEIROS
Como funciona o scanf?
PONTEIROS
Como funciona o scanf?
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.
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.
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:
PONTEIROS
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.
ALOCAÇÃO
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.
ALOCAÇÃO
A variável c do tipo char é criada e
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
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
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,
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
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
O OPERADOR ADDRESS-OF (&)
Retorna o endereço de uma variável
Aparece na tela:
O valor de x = 100
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
PONTEIROS
Aparece na tela:
valor de x = 100
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
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
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*
EXEMPLOS DE UTILIZAÇÃO DE PONTEIROS
Atribuição de ponteiros para ponteiros inteiros
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
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.
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PROBLEMAS COM ATRIBUIÇÃO DE
PONTEIROS
PROBLEMAS COM ATRIBUIÇÃO DE
PONTEIROS
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.
PROBLEMAS COM ATRIBUIÇÃO DE
PONTEIROS
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.
PROBLEMAS COM ATRIBUIÇÃO DE
PONTEIROS
E se substituirmos o ponteiro de inteiro para um
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
PROBLEMAS COM PONTEIROS
Atribuição de um valor diretamente a um ponteiro
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
PROBLEMAS COM PONTEIROS
Atribuição de um valor diretamente a um ponteiro
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
Atribuição de uma referência a um valor de um
ponteiro
PROBLEMAS COM PONTEIROS
2293620 é conversão de 0022FF74 de
Hexadecimal para decimal
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
>
<
==
>=
<=
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
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
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
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
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
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PONTEIROS E STRINGS
Exemplo de execução
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PONTEIROS E STRINGS
Pergunta
PONTEIROS E STRINGS
Pergunta
Será que o código abaixo compila?
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.
PONTEIROS E STRINGS
Pergunta
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PONTEIROS E STRINGS
E agora? Funciona?
PONTEIROS E STRINGS
E agora? Funciona?
A variável array3 agora
aponta para o endereço
do conteúdo do array2
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
PONTEIROS E STRINGS
E agora? Funciona?
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.
Erros ao manipular strings
Erro 2
PONTEIROS E STRINGS
ERRO: o ponteiro p não foi inicializado.
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.
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
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
PASSAGEM DE PARÂMETROS POR
REFERÊNCIA
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PASSAGEM DE PARÂMETROS POR
REFERÊNCIA
PASSAGEM DE PARÂMETROS POR
REFERÊNCIA
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?
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?
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
Exemplo
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
Critério de parada! Importante: Funciona
para o array de caracteres apenas.
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.
PASSAGEM DE PARÂMETROS POR
REFERÊNCIA
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PASSAGEM DE PARÂMETROS POR
REFERÊNCIA
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.
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas