Introdução à Programação  
Aula 08 Ponteiros  
Edirlei Soares de Lima  
<edirlei@iprj.uerj.br>  
Endereço de uma Variável  
Toda variável definida em um programa ocupa uma área de  
memória;  
A cada área de memória está associado um endereço;  
Um endereço é uma sequência de bits codificados da mesma forma  
que um número inteiro sem sinal;  
int x = 20;  
x
endereço da área de  
memoria associada  
a variável x  
2
0
área de memória  
da variável x  
0
x5167841  
Ponteiros  
Um ponteiro é uma variável que armazena um endereço de  
memória;  
Em linguagens tipadas, como C, um ponteiro declara o tipo da  
informação por ele apontada;  
Um ponteiro é declarado colocando-se um asterisco entre o  
tipo da variável e o nome da mesma;  
Exemplo:  
int *p;  
declara que p é um ponteiro para uma área de  
memória que deve armazenar um valor inteiro  
Ponteiros  
int *p;  
int *p = NULL;  
p
endereço da área de  
memoria associada  
a variável p  
0
x0000000  
área de memória  
da variável p  
0
x8162821  
Operadores de Ponteiros  
Existem dois operadores relacionados a ponteiros:  
O operador & retorna o endereço de memória de uma  
variável:  
int *p;  
int a = 40;  
p = &a;  
O operador * retorna o conteúdo do endereço indicado  
pelo ponteiro:  
*
p = 100;  
printf("%d", *p);  
Operadores de Ponteiros  
int main(void)  
{
int *p;  
int x = 40;  
p = &x;  
*
p = 100;  
printf("%d", x);  
return 0;  
}
p = &x;  
p
endereço da área de  
memoria associada  
a variável p  
0
x1234567  
área de memória  
da variável p  
0
x8162821  
Operadores de Ponteiros  
int main(void)  
{
int *p;  
int x = 40;  
p = &x;  
*
p = 100;  
printf("%d", x);  
return 0;  
}
*p = 100;  
x
endereço da área de  
memoria associada  
a variável x  
1
00  
área de memória  
da variável x  
0
x1234567  
Operadores de Ponteiros  
#include <stdio.h>  
int main(void)  
{
int a;  
int *p; /* declaração */  
p = &a; /* inicialização */  
a = 0;  
*p = 2;  
printf("%d", a);  
return 0;  
}
SAIDA:  
2
Operadores de Ponteiros  
#include <stdio.h>  
int main(void)  
{
int a;  
int *p = &a; /*declaração e inicialização*/  
*p = 10;  
printf("%d", a);  
return 0;  
}
SAIDA:  
10  
Operadores de Ponteiros  
#include <stdio.h>  
int main(void)  
{
int num, q = 1;  
int *p;  
num = 100;  
p = &num;  
q = *p;  
printf("%d", q);  
return 0;  
}
SAIDA:  
100  
Cuidados com Ponteiros  
Não se pode atribuir um valor ao endereço apontado pelo  
ponteiro, sem antes ter certeza de que o endereço é válido:  
int a;  
int *c;  
*
c = 20; /* armazenará 20 em qual endereço? */  
O correto seria:  
int a;  
int *c;  
c = &a;  
*c = 13;  
Cuidados com Ponteiros  
Como o operador * de ponteiros é igual ao operador * utilizado  
na multiplicação, deve-se ter cuidado no uso desses operadores:  
#include <stdio.h>  
int main()  
{
int b, a;  
int *c;  
b = 10;  
c = &a;  
Ocorre um erro de compilação,  
pois o * é interpretado como  
operador de ponteiro sobre c  
*c = 11;  
a = b * c;  
printf("%d", a);  
return 0;  
}
Cuidados com Ponteiros  
Para corrigir é necessário isolar o operador de ponteiro na  
expressão:  
#include <stdio.h>  
int main()  
{
int b, a;  
int *c;  
b = 10;  
c = &a;  
*c = 11;  
a = b * (*c);  
printf("%d", a);  
return 0;  
}
Operações com Ponteiros  
include <stdio.h>  
#
int main()  
{
float *a, *b, c, d;  
a = &d;  
b = &c;  
scanf("%f %f", &c, &d);  
if (b < a)  
printf("Endereco apontado por b é menor: %p e %p\n", b, a);  
else if (a < b)  
printf("Endereco apontado por a é menor: %p e %p\n", a, b);  
else if (a == b)  
printf("Mesmo endereco\n"); /* sempre diferentes! */  
if (*a == *b)  
printf("Mesmo conteudo: %f\n", *a);  
return 0;  
}
Passagem de Parâmetros  
Os parâmetros de uma função são o mecanismo  
utilizado para passar a informação de um trecho de  
código para o interior da função.  
Ha dois tipos de passagem de parâmetros:  
Passagem por valor.  
Passagem por referência.  
Passagem de Parâmetros por Valor  
#include <stdio.h>  
void troca(int a, int b)  
{
int tmp = b;  
b = a;  
a = tmp;  
}
int main (void)  
{
int a = 10, b = 20;  
troca(a, b);  
printf("A=%d B=%d", a, b);  
}
SAIDA:  
A = 10 B = 20  
Passagem de Parâmetros por Referência  
A linguagem C permite a passagem de ponteiros para funções.  
Isso permite que as funções possam alterar o conteúdo das  
variáveis indiretamente pelo seu endereço de memória.  
Se uma função g chama uma função f:  
f não pode alterar diretamente valores de variáveis de g, porém se  
g passar para f os valores dos endereços de memória onde as  
variáveis de g estão armazenadas, f pode alterar, indiretamente, os  
valores das variáveis de g.  
Passagem de Parâmetros por Referência  
#include <stdio.h>  
void troca(int *a, int *b)  
{
int tmp = *b;  
*b = *a;  
*a = tmp;  
}
int main (void)  
{
int a = 10, b = 20;  
troca(&a, &b);  
printf("A=%d B=%d", a, b);  
}
SAIDA:  
A = 20 B = 10  
Passagem de Parâmetros por Referência  
Vantagens da utilização de parâmetros por referência:  
Mais eficiência: as funções recebem os endereços para as  
variáveis já inicializadas e o tamanho do endereço é sempre  
o mesmo, assim não há problema envolvendo cópias e  
inicialização.  
Mais liberdade: possibilita a criação de funções que podem  
retornar mais do que um valor.  
Exercício 1  
Qual o valor de x, y e p no final da execução desse trecho de  
código?  
int x, y, *p;  
y = 0;  
p = &y;  
x = *p;  
x = 4;  
(
*p)++;  
x--;  
(
*p) += x;  
Resultado:  
x = 3 y = 4 p = endereço de y  
Exercício 2  
O método misterio(&i, &j) tem um problema. Qual  
é? Antes da chamada do método, temos a seguinte linha de  
comando: int i=6, j=10;  
void misterio(int *p, int *q)  
{
int *temp;  
*
*
*
temp = *p;  
p = *q;  
q = *temp;  
}
Problema:  
O endereço apontado por *temp nunca foi definido  
Leitura Complementar  
Waldemar Celes, Renato Cerqueira, José Lucas  
Rangel, Introdução a Estruturas de Dados, Editora  
Campus (2004).  
Capítulo 4 Ponteiros e Endereços de Variáveis  
Exercícios  
Lista de Exercícios 06 - Ponteiros  
http://www.inf.puc-rio.br/~elima/intro-prog/