Buscar

Aula_Aritmetica_dos_ponteiros

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Aritmética dos Ponteiros 
Recordando... 
Op Significado 
&p Endereço do ponteiro na memória 
*p Conteúdo da área referenciada pelo 
ponteiro 
p++ p-- Incrementa/decrementa o ponteiro 
p == q Verifica se os ponteiros p e q apontam 
para a mesma área de memória 
p = q O ponteiro da esquerda aponta para o 
mesmo local que o da direita 
Aritmética dos ponteiros 
 Exemplo 1: 
 
// Suponha que &x = 0xFFFA e &y = 0xFFC0 
int x=10, y=20, px=&x, py=&y; 
if (px == py)... // falso, 0xFFFA≠0xFFC0 
px = py; // px terá 0xFFC0 
px++; /* px terá 0xFFC2 (inteiro ocupa 
 2 bytes)*/ 
px++; // px terá 0xFFC4 
 
Aritmética dos ponteiros 
 Exemplo 2: 
 
// Suponha que &x = 0xF000 
float x=10.0, *px=&x; 
px++; /* px terá 0xF004 (float ocupa 
 4 bytes)*/ 
px++; // px terá 0xF008 
 
 
Exercícios 
1) V ou F: ao passar um valor para uma função, o 
 endereço deste valor é passado para os parâmetros 
 da função? 
 Falso, uma cópia do valor é que é passado 
 
2)􀂋􀂋 Qual a maneira correta de referenciar ch, 
assumindo que o endereço de ch é o conteúdo do 
ponteiro p? 
 a) *p d) *ch 
 b) int *p e) &p 
 c) ch f) &ch 
 
Exercícios 
(3) Assumindo que o endereço da variável var foi 
 atribuído a um ponteiro pv, escreva uma expressão 
que divida o valor de var por 5 usando apenas o 
ponteiro pv. 
 *pv = *pv / 5; 
 
(4) Na expressão float *fptr; float é o tipo: 
 a) da variável fptr 
 b) do endereço de fptr 
 c) da variável apontada por fptr 
 d) nenhuma das anteriores 
 
Exercícios 
(5) O que deve ser modificado no programa 
seguinte para que ele funcione? 
main() 
{ 
 int j, *ptrj; 
 *ptrj = 3; 
} 
Resp: ptrj = &j; deve ser incluído antes de *ptrj = 3; 
 
Exercícios 
(6) Assumindo que queremos ler o valor de x, 
e o endereço de x foi atribuído a ptrx, a 
instrução seguinte é correta? Se não for, 
corrija-a. 
scanf("%d", *ptrx); 
 
Resp: Não! O correto é scanf("%d", ptrx); 
 
Ponteiros e vetores (recordando) 
 O identificador do vetor é um ponteiro 
– Exemplo: float v[ ] = {1.3,2.2,3.1,8.4}; 
– v é uma constante que endereça o primeiro 
elemento do vetor. 
 &v[0] e v são iguais: acessam o mesmo endereço 
de memória 
 v[0] e *v são iguais: acessam o conteúdo da mesma 
posição de memória. 
– v[i] é igual a: *(v + i) 
 
Ponteiros e vetores (recordando) 
 Exemplo: 
 
int x[] = {10,20,30,40}; /* x é a mesma coisa que &x[0] */ 
*x = 100; // é o mesmo que x[0] = 100; 
*(x+1) = 200; // é o mesmo que x[1] = 200; 
*(x+2) = 300; // é o mesmo que x[2] = 300; 
 
 Podemos dizer que: 
 x[i] é o mesmo que *(x+i) 
 &x[i] é o mesmo que x+i 
 
Programa exemplo 
/* Programa que imprime os elementos de um vetor na Ordem inversa */ 
#include<stdio.h> 
#include<stdlib.h> 
main() 
{ int vet[ ] = {1,2,3,4,5}; 
 int *pv; 
 pv = vet; // vet é o mesmo que &vet[0] 
 
 for (int i=4; i>=0; i--) { 
 printf("\n%d", *(pv+i)); 
 } 
 system("PAUSE"); 
} 
 
Ponteiros e vetores 
 O que há de errado no código abaixo? 
 int x[] = {10,20,30,40}; 
 x++; // Para onde aponta x? 
 
 Resp: x é um ponteiro constante, seu valor não 
pode ser alterado! 
 
 Os outros ponteiros são chamados de variáveis 
int px; 
px = x; 
px++; // Correto! 
 
Exercícios 
(1) O que faz o programa abaixo quando executado? 
main() { 
 int i, *ptr, mat[] = {4, 5, 6}; 
 ptr = mat; 
 for (i=0; i<3 ;i++) 
 { printf("%d ", *ptr); 
 ptr++; 
 } 
} 
􀂋􀂋 Resp: Imprime 4, 5 e 6. 
 
Exercícios 
(2) O que faz o programa abaixo quando 
executado? 
main() { 
 int i, mat[] = {4, 5, 6}; 
 for (i=0; i<3; i++) printf("%d ",mat+i); 
} 
􀂋􀂋 Resp: Imprime os endereços de mat[0], 
mat[1] e mat[2] 
 
Ponteiros para registros 
 Pode-se ter um ponteiro para uma struct 
 struct aluno { 
 char matricula[9]; 
 char nome[30]; 
 int idade; 
 } 
 struct aluno *paluno; 
 
 O ponteiro paluno aponta para o primeiro byte da 
struct aluno 
 
 
Ponteiros para registros 
 Uma aplicação prática: passagem de estruturas por 
referência para funções 
 aluno aluno1; /*declara uma variável */ 
 atualiza_idade(&aluno1, 33); 
 
 void atualiza_idade(aluno *ptr, int i) { 
 (*ptr).idade = i; // 
 } 
 Atenção: os parêntesis são obrigatórios, senão a 
interpretação de *ptr.idade seria que ptr.idade é um 
ponteiro int. 
 
Outra forma de fazer a mesma coisa 
 
 aluno aluno1; /*declara uma variável */ 
 atualiza_idade(&aluno1, 33); 
 
 void atualiza_idade(aluno *ptr, int i) { 
 ptr->idade = i; // igual a (*ptr).idade 
 } 
 
 O operador "->" : acessa o conteúdo de um campo 
da estrutura referenciada pelo ponteiro 
 
	Aritmética dos Ponteiros
	Recordando... 
	Aritmética dos ponteiros
	Aritmética dos ponteiros
	Exercícios
	Exercícios
	Exercícios
	Exercícios
	Ponteiros e vetores (recordando)
	Ponteiros e vetores (recordando)
	Programa exemplo
	Ponteiros e vetores
	Exercícios
	Exercícios
	Ponteiros para registros
	Ponteiros para registros
	Outra forma de fazer a mesma coisa

Continue navegando