Passando Estruturas Inteiras para Funções: Quando uma estrutura é usada como argumento para uma função, a estrutura inteira é passada usando-se o m...
Passando Estruturas Inteiras para Funções: Quando uma estrutura é usada como argumento para uma função, a estrutura inteira é passada usando-se o método padrão de chamada por valor (passagem de parâmetro por cópia). Isso, obviamente, significa que qualquer mudança feita no conteúdo de uma estrutura dentro da função para qual ela é passada não afeta a estrutura usada como argumento. A consideração mais importante para se ter em mente quando se usa uma estrutura como parâmetro é que o tipo do argumento deve corresponder ao tipo do parâmetro. Por exemplo, este programa declara o argumento arg e o parâmetro parm para serem do mesmo tipo de estrutura: para ser um ponteiro para dados daquele tipo: struct endereço *ponteiro_endereço; Usando Ponteiros para Estruturas: Existem muitos usos para ponteiros para estruturas. Um deles é na obtenção de uma chamada por referência para uma função. Outro é na criação de estruturas dinâmicas (listas, filas, pilhas, árvores, etc.). Existe uma desvantagem maior em passar tudo, até a mais simples estrutura, para funções: o esforço necessário para levar (e trazer) todos os campos da estrutura para a pilha. Em estruturas simples, com poucos campos, esse esforço não é tão importante, mas, se muitos campos são usados e se algum deles é matriz, a performance de tempo de execução pode se tornar inaceitável. A solução para esse problema é passar somente um ponteiro para estrutura. Quando um ponteiro para estrutura é passado para uma função, somente o endereço da estrutura é empurrado (e puxado) para a pilha. Isso significa que uma chamada de função extremamente rápida pode ser executada. Também, como estará referenciando a estrutura em si e não uma cópia, a função terá condições de modificar o conteúdo dos campos da estrutura usada na chamada. Para encontrar o endereço de uma variável estrutura, o operador & é colocado antes do nome da variável estrutura. Por exemplo, dado este fragmento struct sal{ float saldo; char nome[80]; } cliente; struct sal *p; // declaração de um ponteiro para estrutura coloca o endereço de cliente no ponteiro p. Para acessar o campo saldo, você pode escrever (*p).saldo Você raramente verá, se vir, referências feitas a um campo de uma estrutura com uso explícito do operador *, como mostrado no exemplo anterior. Uma vez que o acesso a um campo de uma estrutura por meio de um ponteiro para a dada estrutura é tão comum, um operador especial definido pela linguagem C realiza esta tarefa. Ele é o ->, chamada de operador seta. Ele é formado utilizando-se o sinal de menos seguido por um sinal de maior que. A seta é usada no lugar do operador ponto, quando se acessa um campo da estrutura utilizando-se um ponteiro para a variável estrutura. Por exemplo, a declaração anterior é usualmente escrita assim: p->saldo Para ver como um ponteiro para uma estrutura pode ser usado, examine este programa simples que imprime horas, minutos e segundos na sua tela, usando uma rotina de espera cronometrada:
Uma estrutura é passada como argumento para uma função usando o método padrão de chamada por valor. Quando uma estrutura é passada como argumento para uma função, qualquer mudança feita no conteúdo da estrutura dentro da função não afeta a estrutura usada como argumento. A solução para o problema de performance de tempo de execução ao passar uma estrutura para uma função é passar somente um ponteiro para estrutura. Quando um ponteiro para estrutura é passado para uma função, somente o conteúdo da estrutura é empurrado (e puxado) para a pilha. O operador -> é usado no lugar do operador ponto quando se acessa um campo da estrutura utilizando-se um ponteiro para a variável estrutura. a) Somente as afirmativas 1, 2 e 3 estão corretas. b) Somente as afirmativas 2, 3 e 5 estão corretas. c) Somente as afirmativas 1, 3 e 5 estão corretas. d) Somente as afirmativas 2, 4 e 5 estão corretas. e) Todas as afirmativas estão corretas.