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: 15010 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:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#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);......


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:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#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);......


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:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

// método que exibe os dados da estrutura Livro
void exibir_dados(struct Livro const *livro){
  // exibe os dados do livro......


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 é:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

assignment of data-member `Livro::titulo` in ......


Lembre-se que aqui nós temos um PONTEIRO PARA UMA CONSTANTE:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

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.

Link para compartilhar na Internet ou com seus amigos:

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

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 33 usuários muito felizes estudando em nosso site.