C: Revisão de Ponteiros e Ponteiros de Array

De Aulas

Links Relacionados: DAS5102 Fundamentos da Estrutura da Informação

Objetivos

  • Revisar a declaração e utilização de ponteiros na linguagem C;
  • Introduzir o compilador gcc.

Exercício 1

Crie um arquivo chamado ponteiros1.c utilizando um editor de textos padrão (vi, pico, xemacs, gedit) e digite o seguinte programa:

 1/*
 2*  ponteiros.c 
 3*   
 4*  Desc: Primeiro exemplo da utilizacao de ponteiros
 5*
 6*/
 7
 8#include <stdio.h> 
 9
10void main( void )
11{ 
12	//declaracao de variaveis 
13	int x; 
14	int y = 100; 
15	int *p1, *p2, *p3; 
16	 
17	printf("O valor de y eh: %d\n", y); 
18	printf("O valor de x eh: %d\n", x); //explique o valor de x	 
19	p1 = &y; 
20	p2 = &x; 
21	 
22	printf("O valor da posicao de memoria apontada por p1 eh: %d\n", *p1); 
23	printf("O valor de posicao de memoria apontada por p2 eh: %d\n", *p2);	
24	printf("O endereco de p1 eh: %p\n", p1); 
25	printf("o endereco de p2 eh: %p\n", p2); 
26	printf("o endereco de y eh: %p\n", &y);	
27	*p2 = 100; 
28	printf("o novo valor de *p2 eh:%d", *p2); 
29	printf("%x %d %d %d \n", p1, *p1+2, **&p1,3**p1, **&p1+4); 
30}

Como compilar o programa

gcc ponteiros1.c –o ponteiros1

Atividades

A) Execute o programa várias vezes e explique porque o valor de x varia;

B) Execute o programa várias vezes e explique porque o valor de *p2 varia;

C) Explique o que há de errado com a seguinte linha de comando:

1 *p2 = 100;

D) Desafio: Explique o funcionamento da seguinte linha do programa:

1printf("%x %d %d %d \n", p1, *p1+2, **&p1,3**p1, **&p1+4);

Exercício 2

Crie um arquivo chamado ponteiros2.c utilizando um editor de textos padrão (vi, pico, xemacs, gedit) e digite o seguinte programa:

 1*/
 2*  ponteiros2.c 
 3* 
 4*  Desc: Programa exemplo da utilizacao de ponteiros
 5*        com arrays 
 6*  
 7*/
 8
 9#include <stdio.h> 
10void main( void )
11{
12	//declaracao de variaveis 
13	float vet[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; 
14	float *f; 
15	int count; 
16  
17	f = vet; //forma reduzida 
18	printf("contador/valor/valor/endereco/endereco\n"); 
19	
20	for( count = 0; count < 10; count++ ) 
21	{ 
22		printf("vet[%d] = %.1f ", count, vet[count]); 
23		printf("*(f+%d) = %.1f ", count, *(f+count)); 
24		printf("&vet[%d] = %x ", count, &vet[count]); 
25		printf("(f+%d) = %x\n", count, (f+count)); 
26	} 
27}

Como compilar o programa

gcc ponteiros2.c –o ponteiros2

Atividades

A) Explique qual o propósito do programa;

B) Altere o programa para produzir de modo a utilizar o operador unário ++ para incrementar o ponteiro ao invés de f+count

C) Explique porque o programa não funciona corretamente após o contador count ultrapassar o valor 5. Corrija o programa de modo que o erro seja sanado.

Exercício 3

Crie um arquivo chamado ponteiros3.c utilizando um editor de textos padrão (vi, pico, xemacs, gedit) e digite o seguinte programa:

 1/*
 2*  ponteiros3.c 
 3*
 4*  Desc: exemplo de programa para calcular o fatorial 
 5*        de um numero. 
 6*
 7*/
 8
 9#include <stdio.h>
10
11int fatorial (int n);
12
13void main( void ) 
14{ 
15	//declaracao de variaveis 
16	int fatx = fatorial( 8 );
17	printf("%d\n", fatx); 
18} 
19
20int fatorial (int n) 
21{ 
22	int *p; 
23	if(n==1)  
24	return n; 
25	{ *p = n; return fatorial(n-1) * n; }      
26}

Atividades

A) Explique o funcionamento do programa;

B) Identifique a causa provável da razão deste programa não funcionar corretamente, e corrija o mesmo;

C) Procure na internet como passar argumentos para um programa e modifique o mesmo para calcular o fatorial de um número passado como parâmetro ao programa;

D) O programa acima não se encontra bem formatado. Altere o mesmo para que ele fique mais legível.