Академический Документы
Профессиональный Документы
Культура Документы
Linguagem C
Atribuio, Aritmtica e
Comparao de Ponteiros
- Vetores e Ponteiros.
Slides 15
Prof. SIMO
Jean Marcelo SIMO
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;
}
Memria
Pilha
Heap
Memria Voltil de
acesso aleatrio (RAM)
Variveis Globais
Cdigo do Programa
Um mapa conceitual da memria
de um programa em C.
Memria Permanente
Variveis em C
Tipo de dados
char
Variao
0
255
Total de Bytes
Utilizados
1
int
-32.768 a 32.767
short int
-128 a 127
unsigned int
long int
a 65.535
-4.294.967.296 a
4.294.967.296
2
4
float
double
long double
10
void
Aritmtica de Ponteiro
void main ()
{
char *CH;
CH = 3000;
printf (" O endereo apontado por ch %p. \n", ch );
CH = CH + 1;
printf (" O endereo apontado por ch %p. \n", ch );
CH = CH + 1;
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 = INTEIRO + 1;
printf (" O endereo apontado por INTEIRO %p. \n", INTEIRO );
INTEIRO = INTEIRO + 1;
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
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 = Pont + 1;
}
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 = idx + 1;
}
printf("\n");
system("Pause");
return 0;
}
#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 )
{
putchar (*Pont);
// Aritmtica de ponteiros
Pont = Pont + 1;
}
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] )
{
putchar( Pont[idx] );
idx = idx + 1;
}
printf ("\n");
system("Pause");
return 0;
}
Exemplo - Pilha
#include <stdio.h>
#include <stdlib.h>
#define TAMANHO 5
// cabealho de funo para empilhar nmero em um vetor
void empilha ( int i );
// cabealho de funo para desempilhar nmero em um vetor
int desempilha ();
// ponteiro para topo (fim) de vetor
int *Topo;
// ponteiro para base (incio) de vetor
int *Base;
// ponteiro para navegar sobre o vetor pilha via aritmtica de ponteiros
int *Pont;
// vetor para pilha (primeiro nmero a entrar ultimo a sair)
int Pilha[TAMANHO];
// funo principal
int main()
{
int valor, cont = 0;
// Isto significa que o ponteiro Base recebe o endereo de incio do vetor Pilha.
// (Note que no h & comercial para receber o endereo quando se trata de um vetor!)
// (Isto porque o prprio (nome do) vetor internamente implementado como ponteiro...)
// (Isto , o nome do vetor um ponteiro)
Base = Pilha;
// O ponteiro Pont recebe o ponteiro Base
Pont = Base;
// O ponteiro Topo recebe o endereo de fim do vetor Pilha
Topo = Base + TAMANHO;
// O programa em si.
printf ("Programa para empilhar valores \n");
do
{
printf ( "Digite um valor: (-1 para parar) \n );
scanf ( "%d", &valor );
if ( valor != -1 )
{
empilha (valor);
cont = cont + 1;
}
} while ( valor != -1 );
int i;
for ( i = 0; i < cont; i = i + 1 )
{
valor = desempilha();
printf("O %d o. valor desempilhado %d \n", i+1, valor);
}
system("Pause");
return 0;
}
int desempilha ( )
{
// varivel intermediria
int valor;
// Se o ponteiro Pont estiver num endereo maior ou igual que o do Base, isto ,
// Se ele tiver endereo maior ou igual que incio do Vetor Pilha...
// ento se extrai a informao em uma varivel intermediria.
if ( Pont >= Base )
{
// Ponteiro Pont aponta para seu endereo imediatamente inferior
Pont = Pont - 1;
// Valor recebe o valor da 'varivel' apontado por Pont.
valor = *Pont;
}
else
{
printf ("Pilha vazia! \n");
exit (1);
}
return valor;
}