Buscar

Aula_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 24 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 24 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 24 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

Ponteiros 
Ponteiros (ou apontadores) 
 Uma variável que contém o endereço de 
memória de outra variável 
– em geral, um inteiro positivo 
 
 Recurso poderoso 
 
 Torna o código mais eficiente 
– Compilação mais rápida 
 
 
Ponteiros 
 Na linguagem C é usado para: 
 Passagem de parâmetros em funções 
(passagem por referência) 
 Alternativa para acessar vetores e 
matrizes 
 Estruturas de dados dinâmicas 
 
 
Declaração 
 Sintaxe: 
 tipo *identificador; /*o operador * indica q a 
 variável é um ponteiro*/ 
 
 Exemplo: 
 int *p; /*p é um ponteiro para um inteiro*/ 
 
Cuidado! 
 Um ponteiro deve sempre apontar para um 
local válido antes de ser utilizado 
 
Exemplo: 
int main () 
{ 
 int i=10, *pi; 
 *pi = 20; /*erro ! pi nao tem endereco valido*/ 
} 
 
Cuidado! 
 Um ponteiro deve sempre apontar para um 
local válido antes de ser utilizado 
 
Exemplo: 
int main () 
{ 
 int i=10, *pi; 
 pi = &i; /*pi contem o endereco de i*/ 
 *pi = 20; /*i passa a ser 20 */ 
} 
 
Atribuição 
 Exemplo: 
 int num; 
 int *p; 
 
 p = # 
 
 
 Atribuição pode ser: 
– direta: num = 100; 
– indireta: *p = 100; 
 
num 1024 
p 1034 
100 
Endereços Variáveis 
1024 
Operadores & e * 
 Operador &: operador de endereço, que 
quando aplicado sobre uma variável retorna 
o seu endereço 
 
 Operador *: operador indireto, que obtém o 
conteúdo do endereço apontado por uma 
variável 
 
Exemplos 
// ... 
int a = 10; 
int *b; 
 
printf(“Conteudo de a: %d\n", a); 
printf(“Endereco de a: %d\n", &a); 
b = &a; 
printf(“Endereco de b: %d\n", b); 
printf(“Conteudo de b: %d\n", *b); 
 
*b = 15; // atribuicao indireta 
printf(“Conteudo de a: %d\n", a); 
printf(“Conteudo de b: %d\n", *b); 
printf(“Conteudo de a: %d\n", *(&a)); 
// ... 
 
Exemplo 
Ponteiros 
 São variáveis tipadas: 
 (int *) ≠ (float *) ≠ (char *) 
 
 Exemplo: 
 int main() 
 { int *ip, x; 
 float *fp, z; 
 ip = &x; /* OK */ 
 fp = &z; /* OK */ 
 ip = &z; /* erro */ 
 fp = &x; /* erro */ 
 } 
 
Usando Ponteiros 
int main() 
{ 
 int x = 10; 
 int *pi; 
 pi = &x; /* *pi é igual a 10 */ 
 (*pi)++; /* *pi é igual a 11 */ 
 printf(“%d”, x); 
} 
 
 
OBS: Ao alterar *pi estamos alterando o conteúdo de x 
Usando Ponteiros 
int main() 
{ 
 int x = 10; 
 int *pi, *pj; 
 pi = &x; /* *pi é igual a 10 */ 
 pj = pi; /* *pj é igual a 10 */ 
 (*pi)++; /* (*pi, *pj, x) são iguais a 11 */ 
 (*pj)++; /* (*pi, *pj, x) são iguais a 12 */ 
 printf(“%d”, x); /* imprime 12 */ 
} 
 
Prática 
 Pratique a declaração e a utilização de 
ponteiros. 
– defina e inicialize uma variável inteira 
– defina um ponteiro para inteiro 
– modifique o valor da variável através do ponteiro 
– verifique os novos valores da variável usando 
printf 
 
Ponteiros e Vetores 
 Identificador do vetor é um ponteiro 
 Ex: int a[ ] = {1,2,3,4}; 
 a[0] e *a são iguais (acessam a mesma 
posição), 
 Logo: 
– a[i] é igual a: *(a + i) 
 
Ponteiros e Vetores 
 Exemplo: 
 char frase[ ] = {“Testando”}; 
 char *p; 
 p = frase; /* p contem o 
 endereco inicial de frase */ 
 
‘T’ 
‘e’ 
‘s’ 
‘t’ 
‘a’ 
‘n’ 
‘d’ 
‘o’ 
‘\0’ 
frase 
p 
OBS: Em char frase[ ], frase é uma 
constante que endereça o primeiro 
elemento do vetor. 
Referenciando elementos do vetor 
 Pode-se referenciar os elementos do array (vetor) 
através do seu nome e colchetes (acesso direto): 
 Ex: 
 //... 
 m[5] = 5.5; 
 if (m[5] == 5.5) 
 printf(“Exito”); 
 else 
 printf(“Falha”); 
 //... 
Referenciando elementos do vetor 
 Pode-se referenciar os elementos do array (vetor) 
através de ponteiros (acesso indireto): 
 Ex: 
 //... 
 float m[ ] = { 1.0, 3.0, 5.75, 2.345 }; 
 float *pf; 
 pf = &m[2]; 
 printf(“%f”, *pf); /* imprime 5.75 */ 
 //... 
Programa exemplo 
#include<stdio.h> 
#include<stdlib.h> 
main() 
{ int i; char *p; 
 char frase[ ] = {“Aprendendo a usar ponteiros!”}; 
 /*acessando os elementos do vetor diretamente pelo 
nome*/ 
 for(i=0; frase[i] != ‘\0’; i++) 
 putchar(frase[i]); 
 
 /*acessando os elementos do vetor indiretamente por 
meio de ponteiro*/ 
 for(p=frase; *p != ‘\0’; p++) 
 putchar(*p); 
 system(“PAUSE”); 
} 
 
Aritmética de ponteiros 
 É possível fazer operações aritméticas e 
relacionais entre ponteiros e inteiros 
 Soma: ao somar-se um inteiro n a um ponteiro, 
endereçamos n elementos a mais (n positivo) 
ou a menos (n negativo) 
 float m[ ] = { 1.0, 3.0, 5.75, 2.345 }; 
 float *pf; 
 pf = &m[2]; 
 
 
 
pf[2] equivale a *(pf+2) 
*(pf + n) acessa n elementos a frente 
*(pf - n) acessa n elementos atrás 
pf++ acessa o próximo elemento do array 
pf-- acessa o elemento anterior do array 
Operações válidas sobre ponteiros 
 E válido: 
– somar ou subtrair um inteiro a um ponteiro (pi ± int) 
– incrementar ou decrementar ponteiros (pi++, pi--) 
– subtrair ponteiros (produz um inteiro) (pf - pi) 
– comparar ponteiros ( >, >=, <, <=, == ) 
 Não é válido: 
– somar ponteiros (pi + pf) 
– multiplicar ou dividir ponteiros (pi*pf, pi/pf) 
– operar ponteiros com double ou float (pi ± 2.4) 
 
 
Exercício 1: Qual a saída do seguinte 
programa? 
//... 
main() 
{ int x = 4, y = 7; 
 int *px, *py; 
 
 /*imprimindo x e y diretamente*/ 
 printf(“Valor de x: %d Valor de y: %d”, x, y); 
 px = &x; // inicializando o ponteiro px 
 py = &y; // inicializando o ponteiro py 
 *px = *px + 10; 
 *py = *px + 10; 
 printf(“Valor de x: %d Valor de y: %d”, x, y); 
} 
 
Exercício 2 
 Escreva um programa que imprima um vetor 
de inteiros na ordem inversa, acessando os 
elementos por meio de um ponteiro. 
 
Solução 
 
	Ponteiros
	Ponteiros (ou apontadores)
	Ponteiros
	Declaração
	Cuidado!
	Cuidado!
	Atribuição
	Operadores & e *
	Exemplos
	Exemplo
	Ponteiros
	Usando Ponteiros
	Usando Ponteiros 
	Prática
	Ponteiros e Vetores
	Ponteiros e Vetores
	Referenciando elementos do vetor
	Referenciando elementos do vetor
	Programa exemplo
	Aritmética de ponteiros
	Operações válidas sobre ponteiros
	Exercício 1: Qual a saída do seguinte programa? 
	Exercício 2
	Solução

Outros materiais