Aula 15: sobre variáveis e funções |
Variáveis globais são variáveis que podem ser utilizadas em qualquer parte de um programa. |
Variáveis locais estão apenas definidas dentro da função onde são declaradas. |
Com esta nova informação, torna-se muito mais claro saber quando se pode utilizar cada variável. Dentro das funções podemos usar as variáveis globais e as locais. A função main não pode usar a variável da função modulo1, int y. Modulo1 não pode usar a variável da função main, int z. Contudo, as duas funções podem usar a variável global x. |
Aviso: Deve-se evitar a utilização de variáveis globais em funções tanto quando possível. O motivo é simples. Se quisermos copiar a função para outro programa será mais difícil, porque o novo programa provavelmente não terá as mesmas variáveis globais. Utilizando apenas variáveis locais nas funções é muito melhor. Se queremos utilizar as variáveis globais, elas devem ser passadas como parâmetros para a função. Idealmente, uma função é uma unidade independente. |
Mais uma regra, tipicamente para linguagens como o C (compiladores
"single-pass"): As variáveis só podem ser utilizadas
DEPOIS de serem declaradas no programa, assim, se colocamos a declaração
de uma variável depois de uma função, essa função
não poderá usar a variável, mesmo se se tratar de
uma variável global.
Vamos ver alguns exemplos. Comecemos pelo programa da aula 13: |
#include <stdio.h>
/* declare global variables x and y
*/
double x, y;
double square(double r)
{
/* declare local variable localr */
double localr;
/* using the local variable localr */
localr = r*r;
/* using the global variable x */
x = localr;
return(x);
}
void main()
{
x = 4.0;
y = square(x);
}
A variável x é uma variável local e global. Dentro da função, será usada a variável local. |
Quando existem variáveis globais e variáveis locais com
o mesmo nome, a variável local tem prioridade mais elevada e será
portanto utilizada dentro da função. De qualquer forma isto
é confuso, e então devemos sempre evitar utilizar o mesmo
identificador novamente!
Algumas linguagens não fazem distinção entre variáveis locais e globais (por exemplo BASIC). Isto significa que não podemos usar o mesmo nome para variáveis duas vezes. |
x = 2.0;
write_square(x);
printf("%f", x);
}
Após correr a função, o valor de x não
foi alterado. O resultado completo do programa de cima será
4.0
2.0
Passagem por referência:
Por outro lado, se queremos alterar o valor da variável utilizada
para chamar a função, podemos fazê-lo passando o endereço
da variável para a função. Todas as alterações
ao conteúdo deste endereço são permanentes.
void write_square(double *p)
/* p is a pointer-to-double
*/
{
/* change
the contents of address p: */
*p = *p * *p;
/* show the
contents of address p: */
printf("%f", *p);
}
void main()
{
double x;
x = 2.0;
/* now we have to pass
the address (&) of the variable x: */
write_square(&x);
printf("%f", x);
}
Se se correr o programa, o resultado será
4.0
4.0
porque o valor de x foi alterado simultaneamente com o conteúdo
do endereço p.
|
|
#include <stdio.h>
#include <math.h> void convert_to_polar(float x, float y, float
*r, float *theta)
void main()
convert_to_polar(1.0, 1.0, &r1,
&theta1);
|
|
When passing information to functions we have to take even more care
that we don't do any mixing of types, especially when we use pointers.
As a (bad) example:
void double10(double *dp) { *dp = 10.0; } void main()
double10(&x);
|