13.07.2015 Views

A Linguagem C Introdução a Programação em Linguagem C ...

A Linguagem C Introdução a Programação em Linguagem C ...

A Linguagem C Introdução a Programação em Linguagem C ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Funções e Retorno de parâmetrosUma função <strong>em</strong> C pode receber um número qualquer de argumentos e pode retornar no máximo uma única variável(exceto se for por referência). Funções pod<strong>em</strong> também não receber e n<strong>em</strong> retornar argumentos (void). Segu<strong>em</strong>ex<strong>em</strong>plos de protótipos de funções.void teste(void);int calcula(void);void soma(int a, int b, int *resp);struct x * media(char **p, int v[]);O retorno de tipos primitivos <strong>em</strong> uma função é uma operação el<strong>em</strong>entar. Isso ocorre pois a passag<strong>em</strong> é feita por valor,e não por referência. Isso se aplica tanto para variaveis do tipo int, float, b<strong>em</strong> como para estruturas, como no seguinteex<strong>em</strong>plo.#include typedef struct x{int i;int b;}X;X init(){X a;a.i = 3;a.b = 77;return a;}int main(){X ret;ret = init();printf("%d %d", ret.i, ret.b );return 0;}O tratamento de vetores na linguag<strong>em</strong> C não é feito por valor e sim por referência, o que garante maior eficiência,porém ao mesmo t<strong>em</strong>po dificulta o retorno. Isso vale para vetores de qualquer tipo, incluindo strings. Desta forma, oseguinte código está incorreto, apesar de até poder funcionar <strong>em</strong> algumas situações. O compilador Microsoft VisualStudio gera a seguinte warining de compilação: “returning address of local variable or t<strong>em</strong>porary”.int * init(){int v[10]; //vetor local a função init()int i;for(i = 0; i < 10; i++)v[i] = i;return v;}int main(){int *p, i;p = init();}for(i=0; i < 10; i++)printf("%d ", p[i]) ;return 0;Isso ocorre porque todas as variáveis locais de uma função são liberadas quando a mesma é finalizada. Desta forma, oseguinte ex<strong>em</strong>plo é valido visto que na chamdada da funcao teste(), a funcao init() ainda continua ativa.void teste(int *p){int i;for(i=0; i < 10; i++)printf("%d ", p[i]) ;}int main(){init();return 0;}void init()

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!