Você está na página 1de 8

Programao II

3,4,5 e 6 Aula: Apontadores.Arrays de Apontadores. Arrays


Dinmicos. Funes de alocao de memria dinmica
1. O prximo programa mostra algumas operaes bsicas que podem ser executadas
em ponteiros. Para mostrar o resultado de cada operao, o programa imprimir o
valor do ponteiro, o valor armazenado na varivel apontada e o endereo do prprio
ponteiro. Analise a sada deste programa.
#include <stdio.h>

/* apont1.c */

void main()
{
int x=5,y=6;
int *px,*py;
clrscr();

px=&x;
py=&y;
if(px<py)
printf("py-px=%d\n",py-px);
else
printf("px-py=%d\n",px-py);
printf("px=%ld,*px=%d,&px=%ld\n",(long)px,*px,(long)&px);
printf("py=%ld,*py=%d,&py=%ld\n",(long)py,*py,(long)&py);
px++;

printf("px=%ld,*px=%d,&px=%ld\n",(long)px,*px,(long)&px);
py=px+3;
printf("py=%ld,*py=%d,&py=%ld\n",(long)py,*py,(long)&py);
printf("py-px=%d\n",py-px);
getch();
}
/*
Uma sada possvel:
px-py=1
px=4831835944,*px=5,&px=4831835928
py=4831835936,*py=6,&py=4831835920
px=4831835952,*px=0,&px=4831835928
py=4831835976,*py=536868944,&py=4831835920
py-px=3
*/

Ana Almeida Figueiredo

Programao II

2. Qual ser a sada deste programa:


#include <stdio.h>
main()
{
int i=5;
int *p;
clrscr();
p=&i;
printf("%ld %d %d %d %d\n", p, *p+2, **&p, 3**p, *&p+4);
getch();
}
/* 1928134610 7 5 15 1928134614 */
/* verso correcta printf("%ld %d %d %d %ld\n", (long)p,
*p+2, **&p, 3**p, (long)*&p+4); */
3. Se i e j so inteiros e p e q apontadores para inteiros. Quais das seguintes expresses de
atribuio so ilegais? Faa o progrma que permite testar os resultados.
1
2
3
4
5
6
7
8

p=&i
*q=&j
p=&*&i
i=*&j
i=*&*&j
q=&p
i = *(&j);
i=(*p)+++*q

#include <stdio.h>
main()
{
int i, j;
double k;
int *q, *p; /* reserva espaos de memria contguos */
i=10;
j = 20;
clrscr();
printf("&i= %ld, &j =%ld, &k =%ld, &q =%ld, &p = %ld \n",
(long)&i, (long)&j, (long)&k, (long) &q, (long)&p);
p=&i;
printf("%ld \n",(long)p);
*q=&j;
printf("%d \n",*q);
p=&*&i;
Ana Almeida Figueiredo

Programao II

printf("%ld \n",(long)p);
i=*(&j);
printf("%d \n",i);
i=*&*&j;
printf("%d \n",i);
q=&p;
printf("%ld \n",(long)q);
i=*(&j);
printf("%d \n",i);
i=(*p)+++*q;
printf("%d \n",i);
getch();
}

4. Implemente o programa a seguir codificado, verifique e analise o resultado tentando


esquematizar a transferncia de informao entre as funes main( ) e altera( ).
Efectue as transformaes que entender necessrias para que a funo proceda real
transformao dos valores de X e Y.
#include "stdio.h"
void altera(int a, int *ap);
void main()
{
int x, y;
x = 100;
y = 101;
clrscr();
printf("Os valores iniciaos so %d %d\n", x, y);
altera(x, &y);
printf("Os valores finais so %d %d\n", x, y);
getch();
}
void altera(int a, int *ap)
{
printf("Os valores so %d %d\n", a, *ap);
a = 135;
*ap = 172;
printf("Os valores so %d %d\n" ,a, *ap);
}

Ana Almeida Figueiredo

Programao II

/* Result of execution
The starting values are 100 101
The values are 100 101
The values are 135 172
The ending values are 100 172
main

altera

x
100
y
101

a
135
ap

A funo alterada
#include "stdio.h"
void altera(int *a, int *ap);
void main()
{
int x, y;

/*

aptut311.c

*/

x = 100;
y = 101;
clrscr();
printf("Os valores iniciaos so %d %d\n", x, y);
altera(&x, &y);
printf("Os valores finais so %d %d\n", x, y);
getch();
}
void altera(int* a, int *ap)
printf("Os valores so %d %d\n",* a, *ap);
*a = 135;
*ap = 172;
printf("Os valores so %d %d\n" ,*a, *ap);
}

5. Implemente uma funo que permita trocar os valores de duas variveis, dadas via
teclado. Faa o programa que a permita testar.

#include "stdio.h"
void troca(int *a, int *b);
void main()
{
Ana Almeida Figueiredo

Programao II

int x, y;
clrscr();
printf("introduza os valores de X e Y\n", x, y);
scanf("%d %d", &x, &y);
printf("Os valores introduzidos para X e Y so %d %d\n", x, y);
troca(&x, &y);
printf("Os valores de X e Y so %d %d\n", x, y);
getch();
}
void troca(int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
printf("Os valores de *a e *b so %d %d\n" ,*a, *b);
}

6. Escreva uma funo que retorne um apontador para a 1 ocorrncia de um caractere


numa string ou zero se o caractere no existir na string. A funo deve ter como
argumentos a string e o caractere a procurar.
#include<stdio.h>
void main()
{
char *ptr;
char ch,lin[81];
char *procstr(char *l, char c);
clrscr();
puts("Introduza uma string");
gets(lin);
printf("Introduza o caratere a ser procurado:");
ch=getchar();
ptr=procstr(lin,ch);
printf("\nA string comeca no endereco %ld.\n",lin);
if(ptr)
{
printf("Primeira ocorrencia do caractere: %ld.\n",ptr);
printf("Na posicao: %d\n",ptr-lin);
}
else printf("\nCaractere nao existente.\n");
getch();
}
char *procstr(char *l,char c)
{
Ana Almeida Figueiredo

Programao II

while(*l!=c && *l!='\0')


l++;
if(*l!='\0')
return(l);
else
return(0);
}
/* O que se faz na funo procstr, que recebe o 1 elemento da string
adicionar 1 a esse endereo (passar p/ o elemento seguinte) enquanto no
se encontra o caractere pretendido ou o fim da string no contedo da
posio apontada por s.
No fim efectua-se uma comparao entre o contedo da posio de memria
apontada por s, e no caso de ser diferente do fim de string (\0), devolve
o endereo guardado em s, caso contrrio devolve 0 */

7. Faa um programa que que recebe como parmetros do DOS, N variveis do tipo
string, sendo a primeira o nome do programa (as seguintes podem ser por ex: o nome
do utilizador) e em seguida as imprime no ecran, assim como o tamanho de cada uma
delas.
#include <stdio.h>
#include <stdio.h>
main(int argc, char argv[])
{
int i;
clrscr();

/* argmain.c

*/

if (argc == 1)
{
printf("esqueceu-se de digitar o nome\n");
exit(0);
}
else
{
printf("Ol ");
for (i=1; i<argc; i++)
printf(" %s", argv[i]);
printf(" \n existem %d parametros na linha de comando\n", i);
for (i=1; i<argc; i++)
printf(" a string %s tem o tamanho %d \n", argv[i],
strlen(argv[i]));
}
getch();
}

Ana Almeida Figueiredo

Programao II

8. Leia uma sequncia de 10 nmeros do teclado usando apontadores em vez de ndices.


Usando a mesma tcnica determine o maior e o menor valor. Aloque memria dinmica
em vez de declarar o vector duma forma esttica.
#include <stdio.h>
#include <stdlib.h>
void main()
{int *v, *p, *max, *min ;
clrscr() ;
v = (int *)malloc(10*sizeof(int));
/* v=(int *)calloc(10, sizeof(int)); */
if (v==NULL)
{
puts("No existe memoria disponivel\n");
exit(0);
}
printf("Introduza uma sequencia de 10 nmeros\n") ;
for (p=v; p<(v+10); p++)
scanf("%i",p) ;
max=min=v;
for (p=v+1; p<(v+10); p++)
{ if (*p > *max)
max = p ;
if (*p < *min)
min = p ;
}
printf("Mximo -> %i\n",*max) ;
printf("Mnimo -> %i\n",*min) ;
getch() ;
free(v) ;
}

9. Ler uma sequncia de nmeros do teclado (sequencia terminada em zero). Escreva


no cran os nmeros que esto acima da mdia. Use um vector dinmico para
armazenar os nmeros.
#include <stdio.h>
#include <stdlib.h>
void main()
{int *v, *p;
int i, num, tot ;
float med ;
clrscr() ;
printf("Introduza uma sequencia de Ns terminada em zero\n") ;
v = (int *)malloc(sizeof(int)) ;
i=0 ;
tot=0 ;
Ana Almeida Figueiredo

Programao II

scanf("%i",&num) ;
while(num)
{
i++ ;
v=realloc(v,i*sizeof(int)) ;
if (!v)
exit(1) ;
*(v+i-1) = num ;
tot=tot+num ;
scanf("%i",&num) ;
}
med=tot/i;
printf("Mdia dos Ns introduzidos %f\n",med) ;
for (p=v; p<(v+i); p++)
if (*p > med)
printf("Ns Sup. mdia %i\n",*p) ;
getch() ;
free(v) ;
}
/* Sempre que necessario espao p/ mais um elemento, o vector
redimensionado c/ a funo realloc p/ esse elemtno l caber. No final
calcula-se a mdia, e utiliza-se um apontador auxiliar, que vai conter o
endereo de todos os elemntos desde o 1 at ao ltimo. Comparando o
contedo da posio de memria que o apontador auxiliar contm, c/ a
mdia, verifica-se se esse elemento ou no superior e assim sendo se
deve ou no ser impresso. */

Ana Almeida Figueiredo

Você também pode gostar