TA 345 Informática Aplicada à Engenharia de Alimentos

Aula 11: Ponteiros


Ponteiros

Um ponteiro indica o endereço onde um valor é armazenado na memória do computador, ao contrário de uma variável que representa um valor numérico real. Na programação C, os ponteiros freqüentemente fornecem técnicas muito efetivas para representar e manipular dados, sobre tudo estruturas de dados.

Declarando variáveis ponteiro

Você pode declarar uma variável ponteiro para representar o endereço de qualquer tipo de dado em C.

Sintaxe:


       tipo *variável;

O símbolo * é chamado operador de indireção. Se aplicado a uma variável ponteiro, o símbolo indica o valor real armazenado no endereço contido no ponteiro.

Em contrapartida, o símbolo & é conhecido como operador endereço. Anexado no início de um nome de variável, esse operador representa o endereço na memória onde o valor da variável está armazenado.

Utilizando ponteiros para passar parâmetros por endereços

Para esclarecer a diferença entre passar um valor e passar um endereço, examinaremos a saída de duas versões de um pequeno e simples programa de demonstração.

A primeira versão mostra o modo comum de passar argumentos em C.

Exemplo1:


 /* ex21.c  */

#include < stdio.h>    /* diretiva */

void plus (int valor);    /* indica uso de função e variável comum */

main()        /* função principal */
{
        char parada;        /* variáveis locais */
        int i = 1;
        clrscr();
        printf ("O valor original de i é : %d\n", i);
        plus (i);
        printf ("Depois da chamada é : %d\n", i);
}

void plus (valor)/* função secundária que usa variável comum */
{
     valor++;
     printf ("Dentro da função i vale : %d\n", valor);
 }
A função plus recebe um valor igual a 1 em inval e incrementa o valor da variável para 2. Mas quando o controle do programa retorna para a função main(), o valor de i ainda é 1. A alteração que plus realiza no valor de inval não tem efeito no valor de i.

Exemplo2:

 /* ex22.c */

#include < stdio.h>   /* diretiva */

void plus (int *valor);    /* indica o uso de função e ponteiro*/

main()        /* função principal */
{
        char parada;        /* variáveis locais */
        int i = 1;
        clrscr();
        printf ("O valor original de i e : %d\n", i);
        plus (& i);
        printf ("Depois da chamada e : %d\n", i);
         parada = getchar();
}    

void plus (int *valor)   /* função secundária que usa ponteiro*/
{
     (*valor)++;
     printf ("Dentro da funcao i vale : %d\n", valor);
}

Essa segunda versão do programa mostra o efeito de transmitir um endereço para uma função. Se a função realiza alterações nos valores armazenados no endereço, elas são "transmitidas de volta"para o chamador.

Argumentos de matrizes como ponteiros

Agora um exemplo mostrando o que acontece quando um programa trasmite uma variável string para uma função:


/* ex23.c  */

#include < stdio.h>      /* diretivas */
#include < string.h>

void more (char str[]);     /* indica o uso de função */

main()           /* função principal  */
{
      char parada;         /* variáveis locais */
      char saudação[20] = "----Alô";
      clrscr();
      printf ("\nO texto inicial e \" %s\" \n", saudação);
      more (saudação);
      printf ("Depois da chamada:\" %s\"\n", saudação);
      parada = getchar();
}

void more (char str[])    /* função secundária */
{
     strcat (str, "!----");
}
O programa passa uma matriz de caracteres para uma função chamada more. Em main() a matriz é armazenada na variável argumento saudação; a variável correspondente em more é chamada str. A função more simplesmente concatena alguns novos caracteres no final de str.

O programa não utiliza a notação de ponteiro & e * na conexão com a função more; mas a função recebeu claramente o endereço de saudação, não uma cópia do valor da string. A alteração em str tem sido "transmitida de volta" com êxito para greeting na função main().

Esse programa ilustra um fato geral importante sobre matrizes de caracteres: um nome de matriz é um ponteiro para o primeiro elemento da matriz.

Inicializando variáveis ponteiros

As variáveis ponteiro, da mesma maneira que muitas outras variáveis, podem ser inicializadas em sua definição.

Sintaxe:

       tipo *variável = &valor;
Exemplo:
int valor1 = 15;
int *int_ptr = valor1;

A variável valor1 é uma variável int comum e int_ptr é um ponteiro tipo int para uma variável tipo int.


/* ex26.c equação de segundo grau  Fernando Albuquerque pag. 166 */



#include < stdio.h>       /* diretivas */
#include < math.h>

void raizes();   /* indicação de uso de função*/

main()               /* função principal */
{
   char parada;
   float a, b, c, x1, x2;
   clrscr();
   printf ("Qual o valor de a: ");     scanf ("%f", &a);
   printf ("\n");
   printf ("Qual o valor de b: ");     scanf ("%f", &b);
   printf ("\n");
   printf ("Qual o valor de c: ");     scanf ("%f", &c);
   printf ("\n");
   raizes (a, b, c, &x1, &x2);         /* chamada a função */
   printf ("Solução da equação = %f e %f\n", x1, x2);
   parada = getche();
}

void raizes (a, b, c, x1, x2)        /* função secundária */
float  a, b, c, *x1, *x2;
{
   float d;
   d = sqrt( b * b - 4 * a * c);
   *x1 =  - (b + d) / (2 * a);
   *x2 = (d - b) / (2 * a);
}


Voltar à HomePage

Ir para o topo da Página

Ir para a Aula 12