Funções
Definição
Definição e Protótipo
Uma função é definida pelo seu tipo de retorno, nome, declaração de parâmetros, variáveis (locais) que define e pelas instruções que executa.
#include <stdio.h>
int exemplo(int a) {
int b = 2;
a = a + b;
return a;
}
Os protótipos permitem indicar que a função é conhecida pelo o compilador. Uma função deve ser conhecida pelo compilador antes de este "ler" qualquer função que a chame, direta ou indiretamente. Por exemplo, caso main
seja a primeira função com código escrito no nosso source code, devemos ter sempre, ou em header files (.h
) ou antes da main definidos os protótipos de todas as funções auxiliares do programa.
int exemplo(int a);
Return
Retorna o valor da função que irá ser usada por outra.
Quando executada, o valor da expressão
é automaticamente convertido para o tipo de retorno da função definida e esta termina o programa.
Uma funcão pode ainda não devolver nada se o seu tipo de retorno for void
.
#include <stdio.h>
int potencia(int base, int n); /* Protótipo */
int main() {
int i;
for (i = 0; i < 10; i++) {
printf("%d %d %d\n", i, potencia(2, i), potencia(-3, i));
}
return 0;
}
int potencia(int base, int n) {
int i, p = 1;
for (i = 1; i <= n; i++) {
p = p * base;
}
return p;
}
Passagem de Parâmetros
Passagem por Valor e Passagem por Referência
Todos os argumentos são copiados para variáveis temporárias quando a função é executada - a função não tem acesso aos argumentos dados, só às cópias, pelo que quaisquer alterações que se façam às cópias não afetam os argumentos originalmente dados.
Atenção
Existe uma exceção a esta regra: se o argumento for uma tabela, não é efectuada a cópia da tabela. Assim sendo, se a função alterar o conteúdo da tabela, estas alterações preservam-se.
int potencia(int base, int n) {
int p;
for (p = 1; n > 0; n--) {
/* O valor de n dentro da função varia,
* mas fora da função n mantém o seu valor original
*/
p = p * base;
}
return p;
}
int main() {
int n = 2; /* Valor de n antes de ser executada a função potencia */
int base = 6;
int res;
res = potencia(base, n);
printf("%d\n", n);
}
/* O output do programa será 2, pois fora da
* função potencia o valor de n não mudou
*/
Conversão do Tipo de Uma Variável
Para fazer uma divisão entre inteiros, por vezes a parte inteira não chega.
Assim, convertemos o divisor para outro tipo de dados, float
, para que a assim a divisão mostre casas decimais.
float media = soma / (float) num_alunos;
Copiar Tabelas
Uma tabela tem de ser copiada elemento a elemento.
void copia(char destino[], char origem[]) {
int i;
for (i = 0; origem[i] != '\0'; i++) {
destino[i] = origem[i];
}
destino[i] = '\0';
}