Respostas:
Ele permite que você passe o array para uma função por valor ou obtenha-o retornado pelo valor de uma função.
As estruturas podem ser passadas por valor, diferentemente das matrizes que se deterioram para um ponteiro nesses contextos.
Outra vantagem é que ele abstrai o tamanho, para que você não precise usar [MAX]
todo o seu código onde quer que declare esse objeto. Isso também poderia ser alcançado com
typedef char ABC[MAX];
mas então você tem um problema muito maior: você deve estar ciente de que ABC
é um tipo de matriz (mesmo que não possa vê-lo quando declara variáveis do tipo ABC
) ou então será afetado pelo fato de ABC
significar algo diferente em uma lista de argumentos de função versus em uma declaração / definição de variável.
Mais uma vantagem é que a estrutura permite que você adicione mais elementos posteriormente, se necessário, sem precisar reescrever muito código.
Você pode copiar uma estrutura e retornar uma estrutura de uma função.
Você não pode fazer isso com uma matriz - a menos que faça parte de uma estrutura!
Você pode copiá-lo assim.
struct ABC a, b;
........
a = b;
Para uma matriz, você precisaria usar a função memcpy ou um loop para atribuir cada elemento.
Você pode usar struct para criar um novo tipo de dados como string . você pode definir:
struct String {
char Char[MAX];
};
ou você pode criar uma lista de dados que você pode usá-lo por argumento de funções ou retorná-lo em seus métodos. A estrutura é mais flexível que uma matriz, porque pode suportar alguns operadores como = e você pode definir alguns métodos nela.
Espero que seja útil para você :)
Outra vantagem de usá- struct
lo é que ele aplica segurança de tipo onde quer que struct
seja usado; especialmente se você tiver dois tipos que consistem em matrizes do mesmo tamanho usadas para propósitos diferentes, esses tipos ajudarão a evitar o uso acidental de uma matriz de forma inadequada.
Se você não agrupar uma matriz em a struct
, ainda poderá declarar um typedef
para isso: isso tem algumas das vantagens de struct
- • o tipo é declarado uma vez, • o tamanho é automaticamente correto, • a intenção do código fica mais clara, • e o código é mais fácil de manter - mas você perde a segurança estrita do tipo, a capacidade de copiar e retornar valores do tipo e a capacidade de adicionar membros posteriormente sem interromper o restante do código. Dois typedef
s para matrizes nuas de um determinado tipo só produzem tipos diferentes se tiverem tamanhos diferentes. Além disso, se você usar o typedef
sem *
em um argumento de função, será equivalente a char *
reduzir drasticamente a segurança de tipo.
Em resumo :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
Uma estrutura pode conter funções de inicialização, cópia e fini de matriz, simulando algumas das vantagens dos paradigmas de gerenciamento de memória OOP. De fato, é muito fácil estender esse conceito para escrever um utilitário genérico de gerenciamento de memória (usando a estrutura sizeof () para saber exatamente quantos bytes estão sendo gerenciados) para gerenciar qualquer estrutura definida pelo usuário. Muitas das bases de códigos de produção inteligentes escritas em C usam muito essas ferramentas e geralmente nunca usam uma matriz, a menos que seu escopo seja muito local.
De fato, para uma matriz incorporada em uma estrutura, você pode fazer outras "coisas inteligentes", como a verificação vinculada sempre que quiser acessar essa matriz. Novamente, a menos que o escopo do array seja muito limitado, é uma má idéia usá-lo e transmitir informações entre os programas. Mais cedo ou mais tarde, você encontrará bugs que o manterão acordado durante a noite e arruinarão seus fins de semana.
struct
contendo apenas uma matriz.