Risposte:
Consente di passare l'array a una funzione in base al valore o di restituirlo in base al valore da una funzione.
Le strutture possono essere passate per valore, diversamente dalle matrici che decadono in un puntatore in questi contesti.
Un altro vantaggio è che estrae la dimensione in modo da non dover usare [MAX]
tutto il codice ovunque tu dichiari un oggetto del genere. Questo potrebbe anche essere raggiunto con
typedef char ABC[MAX];
ma poi hai un problema molto più grande: devi essere consapevole che ABC
è un tipo di array (anche se non puoi vederlo quando dichiari variabili di tipo ABC
) oppure rimarrai colpito dal fatto che ABC
significherà qualcosa di diverso in un elenco di argomenti di funzioni rispetto a una dichiarazione / definizione variabile.
Un altro vantaggio è che la struttura ti consente di aggiungere più elementi in seguito, se necessario, senza dover riscrivere un sacco di codice.
È possibile copiare una struttura e restituire una struttura da una funzione.
Non puoi farlo con un array - a meno che non faccia parte di uno struct!
Puoi copiarlo in questo modo.
struct ABC a, b;
........
a = b;
Per un array è necessario utilizzare la funzione memcpy o un loop per assegnare ciascun elemento.
Puoi usare struct per creare un nuovo tipo di dati come stringa . puoi definire:
struct String {
char Char[MAX];
};
oppure puoi creare un Elenco di dati che puoi utilizzare per argomento di funzioni o restituirlo nei tuoi metodi. La struttura è più flessibile di un array, perché può supportare alcuni operatori come = e in esso è possibile definire alcuni metodi.
Spero sia utile per te :)
Un altro vantaggio dell'uso di un tale struct
è che applica la sicurezza del tipo ovunque struct
venga usato; specialmente se hai due tipi costituiti da array della stessa dimensione usati per scopi diversi, questi tipi ti aiuteranno a evitare di usare involontariamente un array in modo inappropriato.
Se non si avvolge un array in a struct
, è comunque possibile dichiarare a typedef
per esso: questo presenta alcuni dei vantaggi del struct
- • il tipo viene dichiarato una volta, • la dimensione è automaticamente corretta, • l'intento del codice diventa più chiaro, • e il codice è più gestibile, ma si perde ◦ rigorosa sicurezza del tipo, ◦ la capacità di copiare e restituire valori del tipo e ability la possibilità di aggiungere membri in un secondo momento senza interrompere il resto del codice. Due typedef
s per array nudi di un determinato tipo producono tipi diversi solo se di dimensioni diverse. Inoltre, se si utilizza il typedef
senza *
in un argomento della funzione, equivale a char *
ridurre drasticamente la sicurezza del tipo.
In sintesi :
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
Una struttura può contenere funzioni di inizializzazione, copia e fini dell'array che emulano alcuni dei vantaggi dei paradigmi di gestione della memoria OOP. In effetti, è molto facile estendere questo concetto per scrivere un'utilità di gestione della memoria generica (usando la struttura sizeof () per sapere esattamente quanti byte vengono gestiti) per gestire qualsiasi struttura definita dall'utente. Molte delle basi di codici di produzione intelligenti scritte in C usano queste in modo pesante e in genere non usano mai un array a meno che il suo ambito non sia molto locale.
In effetti, per un array incorporato in una struttura, è possibile fare altre "cose intelligenti" come il controllo associato ogni volta che si desidera accedere a questo array. Ancora una volta, a meno che l'ambito dell'array non sia molto limitato, è una cattiva idea usarlo e passare informazioni tra i programmi. Prima o poi, ti imbatterai in bug che ti terranno sveglio di notte e rovineranno i tuoi fine settimana.
struct
contenente solo un array.