Variáveis Locais - Protótipo de uma função em C

No tutorial passado, de nossa apostila digital C Progressivo, quando estudamos o comando return em C, chegamos a declarar uma variável dentro da função.
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;
}

Um comentário:

Odirlei Paim disse...

Parabéns pelo site e pela iniciativa, mais que um material de Estudo e também um bom guia de consulta.

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.