Você está aqui: C ::: Dicas & Truques ::: Struct (Estruturas, Registros) |
Passando uma estrutura (struct) para uma função (com e sem o uso de ponteiros)Quantidade de visualizações: 15024 vezes |
Muitas vezes precisamos fornecer uma estrutura para uma função. Isso pode ser feito de várias formas, cada uma possuindo características particulares. No trecho de código abaixo nós temos uma função exibir_dados() que recebe uma estrutura e exibe os valores de seus membros. Veja: #include <stdio.h> #include <stdlib.h> #include <string.h> // define a estrutura Livro struct Livro{ char *titulo; int codigo; int paginas; }; // método que exibe os dados da estrutura Livro void exibir_dados(struct Livro livro){ // exibe os dados do livro printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n", livro.titulo, livro.codigo, livro.paginas); } int main(int argc, char *argv[]){ // cria uma instância da estrutura Livro Livro a; // preenche os dados do Livro a.titulo = "Programando em Java"; a.codigo = 342; a.paginas = 230; // passa a estrutura Livro para um método exibir_dados exibir_dados(a); puts("\n\n"); system("PAUSE"); return 0; } Este código, embora funcional, possui duas desvantagens. A primeira é que a estrutura inteira está sendo passada para a função, e isso pode prejudicar o desempenho do programa, devido ao uso desnecessário de recursos. A segunda é que qualquer modificação que fizermos, dentro da função, nos valores dos membros da estrutura não terão qualquer efeito na estrutura original. E isso é compreensível, visto que estamos passando uma cópia da estrutura. Qual a solução? Uso de ponteiros. Veja uma nova versão do código: #include <stdlib.h> #include <string.h> // define a estrutura Livro struct Livro{ char *titulo; int codigo; int paginas; }; // método que exibe os dados da estrutura Livro void exibir_dados(struct Livro *livro){ // exibe os dados do livro printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n", livro->titulo, livro->codigo, livro->paginas); } int main(int argc, char *argv[]){ // cria uma instância da estrutura Livro Livro a; // preenche os dados do Livro a.titulo = "Programando em Java"; a.codigo = 342; a.paginas = 230; // passa a estrutura Livro para um método exibir_dados exibir_dados(&a); puts("\n\n"); system("PAUSE"); return 0; } Agora sim. Em vez de passarmos uma cópia da estrutura nós estamos passando apenas seu endereço de memória para a função que exibe os dados. E o melhor, se qualquer alteração nos valores do membros da estrutura for efetuada dentro da função, o resultado será imediatamente visto na estrutura original. Mas, existe uma forma de passar o endereço da estrutura mas evitar que os valores de seus membros sejam alterados dentro da função? Claro que sim! Basta usarmos o modificador const na assinatura da função (antes do nome da variável ponteiro). Veja: // método que exibe os dados da estrutura Livro void exibir_dados(struct Livro const *livro){ // exibe os dados do livro printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n", livro->titulo, livro->codigo, livro->paginas); } Se tentarmos alterar o valor de alguns dos membros da estrutura dentro da função teremos uma mensagem de erro de compilação. No Dev-C++ (usando MingW) esta mensagem é: assignment of data-member `Livro::titulo` in read-only structure Lembre-se que aqui nós temos um PONTEIRO PARA UMA CONSTANTE: Livro const *livro Isso quer dizer que o ponteiro pode apontar para outro local mas o objeto para o qual ele aponta no momento não poderá sofrer modificações. |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de C |
Veja mais Dicas e truques de C |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |