Outro detalhe que vínhamos fazendo era declarar uma
função com parâmetros e invocar tal função com argumentos, mas os nomes das
variáveis declaradas nos parâmetros eram sempre diferentes dos nomes das
variáveis do argumento.
Vamos entrar em detalhes nesse assunto e estudar a
relação entre variáveis declaradas dentro de funções.
Também vamos ensinar uma forma diferente de declarar
funções, usando protótipos, que nos ajudam a deixar nosso código mais
profissional e organizado.
Variáveis Locais em C
Variáveis locais são variáveis que são declaradas dentro
do escopo da função.
Ou seja, são variáveis que não tem nenhuma ligação com o ‘mundo’
fora da função.
Este tipo de variável é chamado de variável local, pois
ela só existe dentro da função.
O C cria essa variável durante a execução da função, e
após o término desta, ela deixa de existir.
Assim, não é possível acessar ela fora da função.
Vamos usar um exemplo, em que declaramos uma variável
chamada ‘teste’ dentro da main(),
depois passamos essa variável como argumento para uma função que irá modificar
seu valor (incrementando), e depois vamos ver o valor dessa variável.
include <stdio.h> void teste(int a) { a++; printf("Estou dentro da funcao! A variavel foi alterada, e aqui dentr vale: a = %d\n\n",a); } int main(void) { int num1 = 1; printf("Valor inicial de 'num1': %d\n\n", num1); teste(num1); printf("Valor de 'num1' apos ir pra funcao: %d\n", num1); }
Ficou claro que as funções não alteram o valor dos argumentos, nesse caso.
Isso porque essa passagem de parâmetros é dita ser: passagem por valor. Esse nome se deve
ao fato de passarmos uma cópia do argumento para as funções. Não passamos a
variável em sim, mas sim uma cópia dela.
Logo, as funções trabalha com uma cópia, com um valor
igual ao da variável passada como argumento, e não com a variável em si.
Note que, até o momento, usamos o nome das variáveis de
argumento (num1, num2) diferente das variáveis de parâmetro (a, b).
Vamos chamar tudo de ‘a’ e você verá que, mesmo com o
nome da variável sendo o mesmo, a função só trabalhar com uma cópia da variável
e acaba não alterando, em nada, essa variável:
#include <stdio.h> void teste(int a) { a++; printf("Estou dentro da funcao! A variavel foi alterada, e aqui dentr vale: a = %d\n\n",a); } int main(void) { int a = 1; printf("Valor inicial de 'a': %d\n\n", a); teste(a); printf("Valor de 'a' apos ir pra funcao: %d\n", a); }
Como alterar o valor de uma variável passada como argumento
Se você quiser passar uma variável como argumento para
uma função e quer que ela seja alterada, as duas técnicas mais usadas são: passar o endereço da variável e receber o retorno da função.
Em breve, quando você aprender ponteiros, irá saber a
diferença entre passar o valor de uma variável e passar o endereço dessa
variável. Mas, de antemão, adiantamos que se passarmos o endereço da variável,
a função irá alterar o valor da variável.
Para passarmos um endereço de uma variável x qualquer, colocamos o símbolo &
antes da variável: &x.
Mas, como dissemos, estudaremos isso em detalhes na
unidade sobre ponteiros em C.
A outra maneira de alterarmos o valor de uma variável, é
fazer com que ela receba o return de uma função. Veja:
#include <stdio.h> int teste(int a) { a++; printf("Estou dentro da funcao! A variavel foi alterada, e aqui dentr vale: a = %d\n\n",a); return a; } int main(void) { int a = 1; printf("Valor inicial de 'a': %d\n\n", a); a=teste(a); printf("Valor de 'a' apos receber o return da funcao: %d\n", a); }
Protótipos de uma função em C: o que é e como declarar
Sempre declaramos as funções antes da main(), em nosso curso.
Mas à medida que seu código for ficando complexo, você
terá dezenas, centenas ou milhares de linhas de código de funções declaradas
antes de ver a main(), o que não é
muito interessante, já que precisamos ver a main()
para saber o que cada código em C faz.
Uma técnica usada por bons programadores em C, é a de
declarar antes da main() apenas o
protótipo de cada função, e a função em si é declarada após a main().
Para declarar um protótipo, basta pegarmos o cabeçalho de
cada função e adicionar um ponto-e-vírgula ao fim deste. E não colocamos
colchetes depois.
As funções completas, como vinham declarando até então,
será usada após a função main().
É como se, através do uso dos protótipos, disséssemos
para o C: “Hey, essa função existe, ok? Mas eu declarei ela somente ao fim da
main(). Mas sabia, de antemão, que ela existe, está declarada e vamos usá-la.
Portanto, vá lá onde ela está declarada e compile ela!”
O exemplo passado de código, usando protótipos, é:
#include <stdio.h> int teste(int a); int main(void) { int a = 1; printf("Valor inicial de 'a': %d\n\n", a); a=teste(a); printf("Valor de 'a' apos receber o return da funcao: %d\n", a); } int teste(int a) { a++; printf("Estou dentro da funcao! A variavel foi alterada, e aqui dentro vale: a = %d\n\n",a); return a; }
4 comentários:
Parabéns pelo site e pela iniciativa, mais que um material de Estudo e também um bom guia de consulta.
Um site muito bom e completo, para que realmente gosta de programar. Parabéns
Seu site é muito bom, só estou aprendendo por aqui, e com a intenção de somar ao site ,percebi um erro sobre prototipos de função....
onde se lê colchetes...Para declarar um protótipo, basta pegarmos o cabeçalho de cada função e adicionar um ponto-e-vírgula ao fim deste. E não colocamos colchetes depois....deveria ser chaves{} ....colchetes é pra vetor..[].....
Parabéns pelo site! Está sendo ótimo ter um local para consultar algumas dúvidas!
Muito obrigado por tudo!
Postar um comentário