Escolar Documentos
Profissional Documentos
Cultura Documentos
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;
p = &x;
y = *p;
// ...
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;
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
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);
}