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