Anda di halaman 1dari 12

Fundamentos de Programao 1

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

Aproximadamente 6 dgitos de preciso

double

Aproximadamente 10 dgitos de preciso

long double

Aproximadamente 10 dgitos de preciso

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;
}

void empilha ( int i )


{
// Se o ponteiro Pont estiver apontando j para o topo
// ento no se pode mais empilhar o nmero i
if ( Pont == Topo )
{
printf ("Pilha cheia! \n");
// sai do programa
exit (1);
}
else
{
// A "varivel" apontada por Pont recebe o valor de i , i.e. a posio Pilha[0] recebe o valor de i.
*Pont = i;
// ponteiro Pont avana da sua posio inicial em 2 bytes (tamanho de um inteiro)
// (i.e. Pont avana para seu endereo imediatamente superior)
Pont = Pont + 1;
}
}

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;
}