Você está na página 1de 22

1

Ponteiros e Alocao Esttica


Prof. Maurcio Scoton
Mauricio.scoton@aedu.com

Ponteiros
A linguagem C permite que o programador referencie
a posio de objetos bem como os prprios objetos
(isto , o contedo de suas posies).
Por exemplo, se x for declarado como um inteiro, &x
se referir posio reservada para conter x. &x
chamado ponteiro.

Ponteiros
possvel declarar uma varivel cujo tipo de dado
seja um ponteiro e cujos possveis valores sejam
posies de memria. Por exemplo, as declaraes:
int *pi;
float *pf;
char *pc;

Ponteiros
So declaraes de trs variveis ponteiros:
pi um ponteiro para um inteiro;
pf um ponteiro para um float;
pc um ponteiro para um caractere.

O asterisco indica que os valores das variveis sendo


declaradas, so ponteiros para valores do tipo
especificado na declarao, em vez de objetos desse
tipo (ou simples variveis).

Ponteiros
Um ponteiro como qualquer outro tipo de dado em
C. O valor de um ponteiro uma posio de memria
da mesma forma que o valor de um inteiro um
nmero. Os valores dos ponteiros podem ser
atribudos como quaisquer outros valores.
Por exemplo, a declarao:
pi = &x; atribui o endereo do inteiro x varivel
ponteiro pi.

Ponteiros
A notao *pi em C refere-se ao inteiro na posio
referenciada pelo ponteiro pi. A declarao:
x = *pi; atribui o valor deste inteiro varivel inteira x.

A seguinte atribuio invlida:

int x;
int y;
y = &x;

Ponteiros
No possvel atribuir um ponteiro para inteiro x a
uma varivel y. Para isso necessrio que y, seja
declarado como um ponteiro.
A linguagem C insiste em que uma declarao de um
ponteiro especifique o tipo de dado para o qual o
ponteiro aponta.

Ponteiros
Uma rea na qual os ponteiros de C desempenham
um notvel papel na passagem de parmetros para
funes.
Normalmente, os parmetros so passados para um
funo em C por valor, isto , os valores sendo
passados so copiados nos parmetros da funo
chamada no momento em que a funo for
chamada.

Ponteiros
Se o valor de um parmetro for alterado dentro da
funo, o valor no programa de chamada no ser
modificado.

Exemplo de Passagem de Parmetro por valor (sem


ponteiro) - pass_param_valor.cpp
void funct(int y);
main()
{
int x;
x = 5;
printf("O valor de x: %i", x);
funct(x);
printf("\nO valor de x: %i", x);
getche();
}
void funct(int y)
{
++y;
printf("\nO valor de y: %i", y);
}

108

104

108

104

Exemplo de passagem de parmetro por referncia


(com ponteiro) pass_param_ref.cpp
void funct(int *py);
main()
{
int x;
x = 5;
printf("O valor de x: %i", x);
funct(&x);
printf("\nO valor de x: %i", x);
getche();
}
void funct(int *py)
{
++(*py);
printf("\nO valor de py: %i", *py);
}

108

py

104

108

py

108

104

108

py

108

104

Programa Exemplo Arquivo


main()
Ponteiro.cpp
{
int *a;
int b;
printf("Endereco de a: %i",&a); /*imprime o endereo de a:
2293620*/
printf("\nEndereco de b: %i",&b); /*imprime o endereo de b:
2293616*/
b = 3;
a = &b; /*ponteiro a aponta para o mesmo endereo de b*/
printf("\nEndereco que a aponta: %i",a); /*endereo que a aponta:
2293616 */
printf("\nValor de a: %i",*a); /*o valor de a 3*/
printf("\nValor de b: %i", b); /*o valor de b 3*/
*a = 5; /* *a tem seu valor alterado para 5*/
printf("\n*a = 5");
printf("\nValor de a: %i",*a); /*o valor de a passa a ser 5*/
printf("\nValor de b: %i",b); /* o valor de b passa a ser 5 */
getche();
}

Ponteiro de Ponteiro
possvel pela linguagem C, a definio de ponteiro
de ponteiro, isto , uma varivel ponteiro que pode
receber o endereo de outra varivel ponteiro. Por
exemplo, a declarao:
int *px;
int **py;

px um ponteiro para inteiro e py um ponteiro de


ponteiro para inteiro.

Ponteiro de Ponteiro
Dessa forma, a seguinte atribuio vlida:
py = &px; em que o ponteiro de ponteiro py aponta para o
mesmo endereo do ponteiro px.
Se a declarao fosse realizada da seguinte forma:
int *px;
int *py;
py = &px;
Ocasionaria uma operao invlida de atribuio do endereo
de um ponteiro para outro ponteiro. Para isso, necessrio
um ponteiro de ponteiro.

Exemplo de Ponteiro de Ponteiro Arquivo Ponteiro2.cpp


main()
{
int x;
int *px;
int **py;
printf("Entre com um valor
inteiro para x: ");
scanf("%i",&x);
px = &x;
printf("\npx = &x");
printf("\nO endereco de x:
%i",&x);
printf("\nO endereco de px:
%i",&px);
printf("\nO endereco que px
aponta: %i",px);
printf("\n\nO valor de x: %i",x);
printf("\nO valor de px: %i",*px);

*px = x*(*px);
printf("\n\n*px = x*(*px)");
printf("\nO valor de x: %i",x);
printf("\nO valor de px: %i",*px);
py = &px;
printf("\n\npy = &px");
printf("\nO endereco de px:
%i",&px);
printf("\nO endereco de py:
%i",&py);
printf("\nO endereco que py aponta:
%i",py);
printf("\n\nO valor de px: %i",*px);
printf("\nO valor de py: %i",**py);
**py = *px * x;
printf("\n\n**py = *px * x");
printf("\nO valor de x: %i",x);
printf("\nO valor de px: %i",*px);
printf("\nO valor de py: %i",**py);
getche();

Ilustrao de Ponteiro pra Ponteiro

x
10

*px

100

10000

2293620

2293620

2293616

2293616

2293612

**py

Alocao Esttica de Memria


Na alocao esttica de memria, os dados so
representados por variveis estticas, possuindo um
tamanho fixo e organizados sequencialmente na
memria do computador.
Um exemplo tpico de alocao esttica so os
vetores. O acesso aos seus componentes feito de
maneira direta (atravs de um ndice, por exemplo).

Alocao Esttica de Memria


Representao:
1

...

n-1

Vantagens: Alm de todas as vantagens inerentes a


manipulao de variveis estticas, tambm tm
como caracterstica marcante o fato de poderem ser
implementadas em praticamente todas as linguagens
de programao mais utilizadas (C, Pascal, COBOL,
Fortran, Clipper, Java, etc).

Alocao Esttica de Memria


Desvantagens:
A quantidade de ns (posies) declarada
necessita permanecer alocada.
Ex: declarar 500 posies e utilizar apenas 10 posies.

Uso excessivo da memria, mesmo sem usar.

Alocao Esttica de Memria


A alocao esttica de memria pode ser utilizada
para a implementao, usando vetores, das
seguintes estruturas:
Listas estticas: estruturas que permitem representar
um conjunto de dados de forma a preservar a
relao de ordem linear entre eles. Uma lista linear
composta de ns que podem conter tanto tipos de
dados primitivos quanto construdos.
Ex: Lista de Alunos, Lista de DVDs, Lista de Cds, etc.

Alocao Esttica de Memria


Filas estticas: estruturas semelhante a listas
estticas, porm com disciplina de insero e
remoo de dados. O sistema a ser utilizado o FIFO
(First In First Out) ou Primeiro a Entrar Primeiro a
Sair. Exemplos: filas de impresso, filas de banco,
etc.
Pilhas estticas: estruturas semelhantes a listas
estticas, apresentando assim como as filas,
disciplina de insero e remoo. O sistema a ser
utilizado o LIFO (Last In First Out) ou ltima a
Entrar Primeiro a Sair. Exemplos: pilha de alocao
de variveis, pilha de bolachas, etc.