Você está na página 1de 14

Computao 2

Aula 6
Ponteiros

Diego Addan
diegoaddan@gmail.com

O que so Ponteiros?
Um ponteiro uma varivel que contm um endereo de
memria. Este endereo normalmente a posio de uma
outra varivel na memria. Se uma varivel contm o
endereo de um outra, ento a primeira varivel dita
apontar para a segunda [Schiltd, 1997].

Endereo na
memria

Varivel na
memria

1000

1003

1001

1002

1003

1004

Ponteiros
Variveis ponteiros:
Se uma varivel ir conter um ponteiro, ela deve ser
declarada como tal. Uma declarao de ponteiro consiste
no tipo, um * e o nome da varivel. A forma geral para
declarar um ponteiro :

<tipo> *nome_varivel;
onde <tipo> qualquer tipo vlido em C.
O tipo base do ponteiro define que tipo de variveis o
ponteiro pode apontar.

Os operadores de Ponteiros
Existem dois operadores especiais para ponteiros: * e
&.
O & um operador unrio que devolve o endereo na
memria do seu operando (um operador unrio requer
apenas um operando). Por exemplo:
m = &count;
coloca em m o endereo de memria que contm a varivel count.
O operador & pode ser imaginado como retornando o endereo
de. Assim, esse comando de atribuio significa m recebe o
endereo de count.

Os operadores de Ponteiros
O operador * tambm um operador unrio que
devolve o valor da varivel localizada no endereo que
o segue. Por exemplo, se m contm o endereo da
varivel count:
q = *m;
coloca o valor de count em q. O operador * pode ser imaginado
como no endereo. Nesse caso, o comando anterior siginifica q
recebe o valor que est no endereo m

Exemplo
#include <stdlib.h>
#include <stdio.h>
int main()
{
int x, y;
x = 1;
int* p;

// Declarao de um ponteiro para inteiro.


// Isto significa que p poder apontar para um inteiro.
// Um ponteiro declarado com auxilio do *

p = &x;

// Aqui o ponteiro recebe o endereo da varivel x na memria.


// Para um ponterio receber o endereo de uma varivel
// necessrio utilizar o operador & antes da varivel.

y = *p;

// Aqui a varivel y recebe o valor da varivel apontada pelo


// ponteiro p. Na prtica, isto significa que y ter o valor
// da varivel x.
// Para uma varivel receber o valor da variavl apontado por
// um ponteiro, necessrio utilizar o operador *.
// Assim sendo, o operador * serve para diversas funes em C:
// - serve para declarar um ponteiro.
// - serve para informar o valor de uma varivel apontada.
// - serve para multiplicar dois nmeros (sua funo primordial).
// Portanto, o uso do * depende do contexto.

// ...

Continuao do exemplo
// ...
printf ("O valor da varivel x : %i. \n", x);
printf ("O endereo da varivel x : %p. \n", &x);
printf ("\n");
printf ("O valor da varivel x via o ponteiro p : %i. \n", *p);
printf ("O endereo da varivel x via o ponteiro p: %p. \n", p);
printf ("O endereo do ponteiro p : %p. \n", &p);
printf ("\n");
printf ("O valor da varivel y, adquirido de x, via p: %i. \n", y);
printf ("O endereo da varivel y : %p. \n", &y);
printf ("\n");
// O %p serve para expressar o valor de um endereo de memria.
system("Pause");
return 0;
}

Exemplo 2

Exemplo 3
#include <stdlib.h>
#include <stdio.h>
int main()
{ int x, y; x = 1;
int *p;
p = &x;
y = *p;
printf ("O valor da varivel x : %i. \n", x);
printf ("O endereo da varivel x : %p. \n \n", &x);
printf ("O valor da varivel x via o ponteiro p : %i. \n", *p);
printf ("O endereo da varivel x via o ponteiro p: %p. \n", p);
printf ("O endereo do ponteiro p : %p. \n \n", &p);
printf ("O valor da varivel y, adquirido de x, via p: %i. \n", y);
printf ("O endereo da varivel y : %p. \n \n", &y);
*p = 5;

// Aqui muda-se o valor de x via *p.

printf("O novo valor da varivel x : %i. \n", x);


printf("O endereo da varivel x : %p. \n \n", &x);
printf("O novo valor da varivel x via o ponteiro p: %i. \n", *p);
printf("O endereo da varivel x via o ponteiro p: %p. \n", p);
printf("O endereo do ponteiro p : %p. \n \n", &p);
...
}

Atribuio de Ponteiros.
#include <stdio.h>
#include <stdlib.h>
void main ()
{
int x = 3;
int *p1, *p2;
p1 = &x;
p2 = p1;
printf (" O endereo da varivel x %p. \n", p2 );
system ("Pause");
return 0;
}

Aritmtica de Ponteiro
void main ()
{
char *CH;
CH = 3000;
printf (" O endereo apontado por ch %p. \n", ch );
CH++;
printf (" O endereo apontado por ch %p. \n", ch );
CH++;
printf (" O endereo apontado por ch %p. \n", ch );
}

void main ()
{
int *INTEIRO;
INTEIRO = 3000;
printf (" O endereo apontado por INTEIRO %p. \n", INTEIRO );
INTEIRO++;
printf (" O endereo apontado por INTEIRO %p. \n", INTEIRO );
INTEIRO++;
printf (" O endereo apontado por INTEIRO %p. \n", INTEIRO );
}

Endereos de Memria.
CH

3000
INTEIRO

CH + 1

3001

CH + 2

3002

CH + 3

3003

CH + 4

3004

CH + 5

3005

INTEIRO + 1

INTEIRO + 1

Variveis em C
Tipo de dados

char

Variao

255

Total de
Bytes
Utilizados
1

int

-32.768 a 32.767

short int

-128 a 127

unsigned int
(nat)
long int

a 65.535

-4.294.967.296 a

4.294.967.296

2
4

float

Aproximadamente 6 dgitos de preciso

double

Aproximadamente 10 dgitos de
preciso

long double

Aproximadamente 10 dgitos de
preciso

10

void

Vetores e Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main()
{ // Define e inicializa uma string.
char str [80] = "Universidades";
// Um ponteiro chamando Pont para caractere.
char *Pont;
// O ponteiro Pont recebe o endereo da primeira posio da str.
// O nome de um string sozinho sempre o endereo da primeira posio.
// Obs.: Neste caso, no necessrio &.
Pont = str;
// Enquanto o contedo do ponteiro no for \0.
while ( *Pont != '\0')
{
putchar (*Pont);
// Aritmtica de ponteiros
Pont++;
}
printf("\n");
Pont = str;
// O ponteiro que aponta para o primeiro elemento de uma string pode ainda se
// comportar como um vetor!!!!
int idx = 0;
while( Pont[idx] != '\0 )
{
putchar( Pont[idx] );
idx++;
}
printf("\n");
return 0;
}

Exerccio
Reescreva o programa abaixo usando ponteiros
int main ()
{
float matrx [50][50];
int i,j;
for (i=0;i<50;i++)
for (j=0;j<50;j++)
matrx[i][j]=0.0;
return(0);
}

Você também pode gostar