\documentclass[apostila.tex]{subfiles} \begin{document} \chapter{Funções} Uma função é uma seção independente de código em C, designada por um nome, que realiza uma tarefa específica e, opcionalmente, retorna um valor ao programa que a chamou. \section{Protótipo} O protótipo da função fornece ao compilador uma descrição de uma função que será definida posteriormente no programa. O protótipo inclui o tipo de retorno, que indica o tipo de variável que a função retornará. Além disso, ele inclui também o nome da função, os tipos de variáveis dos argumentos que serão passados para a função e opcionalmente o nome dos argumentos. O protótipo sempre termina com `;'. \begin{lstlisting} tipo_de_retorno nome_funcao (tipo1 arg1,..., tipoN argN); \end{lstlisting} \section{Definição} A definição da função é a função propriamente dita. A definição contém as instruções que serão executadas. A primeira linha de uma definição de função, chamada de cabeçalho da função, deve ser idêntica ao protótipo da função, com exceção do ponto-e-vírgula final. Os nomes das variáveis usadas como argumentos devem necessariamente ser incluídos no cabeçalho. A seguir vem o corpo da função, contendo as instruções que a função executará contidas num bloco. Se o tipo de retorno da função não for void, uma instrução return deve ser incluída para retornar um valor compatível com o tipo de retorno especificado. \begin{lstlisting} tipo_de_retorno nome_funcao(tipo1 arg1, ..., tipoN argN) { instruções; } \end{lstlisting} \subsection{Tipo de retorno} Especifica o tipo de dado que a função deverá retornar ao programa que a chamou. O tipo pode ser qualquer dos tipos válidos em C ou um tipo definido pelo programador. A função pode não retornar nenhum valor. \begin{lstlisting} int func1(...) // retorna um tipo int void func2(...) // não retorna dados \end{lstlisting} Para retornar um valor a partir de uma função, é usada a palavra-chave return seguida por uma expressão válida em C. Quando a execução atinge a instrução return, a expressão é avaliada e o valor é transmitido para o programa que originou a chamada. O valor de retorno de uma função é o valor da expressão. \begin{lstlisting} int func1(...) { int x; // declaracao da variavel ... // demais instrucoes ... return x*2; // retorna x*2 } \end{lstlisting} \subsection{Nome da função} Pode ser qualquer nome, contanto que siga as regras adotadas para atribuir nomes de variáveis em C. O nome da função deve ser único e é sempre aconselhável usar um nome que reflita a finalidade da função. \subsection{Corpo da função} É delimitado por chaves e colocado imediatamente após o cabeçalho da função. Quando uma função é chamada, a execução começa no início do corpo e termina (retornando ao programa de origem) quando uma instrução return é encontrada ou quando a execução chega ao final do bloco. Podemos declarar variáveis dentro do corpo de uma função. Estas variáveis são chamadas de variáveis locais, significando que são privativas desta função e distintas de outras variáveis com o mesmo nome que possam ter sido declaradas em outras partes do programa. A declaração destas variáveis deve ser feita antes de qualquer instrução. \section{Chamada de funções} \subsection{Chamadas por valor} Quando uma variável é passada para uma função pelo valor, a função tem acesso ao valor da variável, mas não à própria variável original. Portanto, as instruções contidas na função não podem modificar o valor da variável original. \subsection{Chamadas por referência} Neste caso a função recebe o endereço de memória (uma referência) do parâmetro, ao invés do valor do parâmetro. Desta forma, a função pode alterar o valor da variável mediante a utilização deste endereço. Tanto a função quanto o programa devem ser informados de que um parâmetro é chamado por referência utilizando os operadores \& (para passar um endereço) e * (para receber um endereço). exemplo: \lstinputlisting{exemplos/funcao_parametro_por_valor_e_referencia.c} A saída será: \begin{verbatim} Antes de chamar por valor() : x = 2, y = 4, z = 6 Depois de chamar por valor(): x = 2, y = 4, z = 6 Depois de chamar por ref() : x = 0, y = 0, z = 0 \end{verbatim} Obs.: \begin{description} \item[\&] Passa o endereço de memória da variável passada por parâmetro e, portanto, as modificações sobre esta variável realizadas na função são permanentes. \item[*] Acessa o conteúdo de tal endereço de memória. \end{description} \section{Exemplo de função} \lstinputlisting{exemplos/exemplo_funcao.c} \section*{Exercícios} 1. Transforme o programa que detecta se um número é primo em uma função. 2. Escreva uma função que gera e imprime os primeiros n números primos, sendo que n é o parâmetro desta função. \end{document}