C: Revisão de Ponteiros e Ponteiros de Array
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.