Differenza tra struttura e unione
Contenuto
C ++ consente tutti e cinque i modi forniti dal linguaggio C per creare dati personalizzati. Questi cinque modi sono "struttura", "campo bit", "unione", "enumerazione", "typedef". Nell'articolo che segue studieremo la differenza tra struttura e unione. La struttura e l'unione sono entrambi i tipi di dati contenitore che possono contenere dati di qualsiasi "tipo". L'unica differenza principale che distingue la struttura e l'unione è che la struttura ha una posizione di memoria separata per ciascuno dei suoi membri, mentre i membri di un'unione condividono la stessa posizione di memoria.
Comprendiamo la differenza tra struttura e unione, insieme a un grafico di confronto.
- Tabella di comparazione
- Definizione
- Differenze chiave
- Somiglianze
- Conclusione
Tabella di comparazione
Base di confronto | Struttura | Unione |
---|---|---|
Di base | La posizione di memoria separata viene assegnata a ciascun membro della struttura. | Tutti i membri del sindacato condividono la stessa posizione di memoria. |
Dichiarazione | nome_struttura { digitare element1; digitare element2; . . } variabile1, variabile2, ...; | union u_name { digitare element1; digitare element2; . . } variabile1, variabile2, ...; |
parola chiave | struct | unione |
Taglia | Dimensione della struttura = somma delle dimensioni di tutti i membri dei dati. | Dimensione dell'Unione = dimensione dei membri più grandi. |
Valore del negozio | Memorizza valori distinti per tutti i membri. | Memorizza lo stesso valore per tutti i membri. |
Al tempo | Una struttura memorizza più valori, dei diversi membri, della struttura. | Un'unione memorizza un singolo valore alla volta per tutti i membri. |
Modo di visione | Fornire un modo unico per visualizzare ogni posizione di memoria. | Fornire più modi per visualizzare la stessa posizione di memoria. |
Caratteristica anonima | Nessuna funzione anonima. | L'unione anonima può essere dichiarata. |
Definizione di struttura
La struttura è una raccolta di variabili di diversi tipi di dati, a cui fa riferimento un nome comune. Le variabili in una struttura sono chiamate "membri". Per impostazione predefinita, tutti i membri di una struttura sono "pubblici". Quando si dichiara una struttura, si crea un modello, che può essere utilizzato per creare oggetti struttura, condividendo la stessa organizzazione di membri di dati e funzioni membro. La dichiarazione della struttura è sempre preceduta dalla parola chiave "struct", che indica al compilatore che una struttura è stata dichiarata. Facciamo un esempio.
Facciamo un esempio.
struct employee {nome stringa; stringa nome_azienda; città della stringa; } Emp1, EMP2;
Qui, dichiariamo una struttura per la memorizzazione delle informazioni dei dipendenti. La dichiarazione è terminata da un punto e virgola, poiché la dichiarazione di struttura è un'istruzione e, in C ++, la dichiarazione è terminata da un punto e virgola.
Il nome assegnato a una struttura definisce un "tipo" (nell'esempio sopra il nome della struttura è "impiegato"). Le variabili di questi tipi potrebbero essere create, come sopra, abbiamo creato due variabili "emp1" e "emp2" di tipo "dipendente". Nell'esempio sopra, abbiamo creato una variabile "struttura" subito dopo la dichiarazione; in alternativa, potrebbe essere creato separatamente.
struct impiegato emp1, emp2; // la parola chiave struct non è obbligatoria.
I membri di una variabile di struttura possono essere inizializzati o è possibile accedervi utilizzando l'operatore punto (.).
emp1.name = "Ashok";
Le informazioni contenute in una variabile di struttura possono essere assegnate a un'altra variabile di struttura dello stesso tipo come segue.
emp1.name = "Ashok"; emp1.company_name = "Teckpix"; emp1.city = "Delhi"; EMP2 = dip1; // assegnando i valori del membro di emp1 a emp2. cout <
Qui, abbiamo assegnato la variabile di struttura "emp1" a "emp2", quindi "emp1" copia tutto il valore dei suoi membri nel membro corrispondente di "epm2".
Il membro della variabile struttura può essere passato alla funzione.
Funz (emp1.city);
L'intera variabile di struttura può essere passata alla funzione, sia con i metodi call by value che call by reference.
Funt (dip1); // chiama funzione per chiamata per metodo valore. . . void funct (struct employee emp) {// recupero dei valori dei membri di emp1. cout <
In questo caso, la modifica del valore di un membro della variabile di struttura non si rifletterà all'esterno della funzione poiché una variabile viene passata per chiamata dal metodo value. Ora facciamo la stessa cosa chiamando per metodo di riferimento.
Funt (& dip1); // chiama la funzione per chiamata per metodo di riferimento. . . void funct (struct employee * emp) {// indirizzo ricevente di emp1. EMP> city = "Nur"; // cambia il valore del membro (città) della variabile struttura emp1. . }
Qui, la variabile di struttura viene passata per riferimento, quindi anche la modifica del valore dei membri della variabile di struttura si riflette all'esterno della funzione.
impiegato dipendente * emp; // decimale il puntatore alla struttura di tipo dipendente. emp = & dip1; // assegna l'indirizzo di emp1 al puntatore. emp-> city // pointer accede alla città membro di emp1.
È anche possibile creare il puntatore alla struttura; contiene l'indirizzo della variabile struttura.
Nella struttura l'inizializzazione aggregata è consentita quando la definizione della struttura non contiene alcun costruttore definito dall'utente o funzioni virtuali o classe base o campo privato o protetto.
int main () {struct epm3 = {"Anil", "Teckpix", "Nur"}; } // Possibile in quanto la struttura del dipendente non contiene nessuna delle cose sopra menzionate.
Definizione di Unione
Un'unione è una posizione di memoria condivisa da due o più tipi diversi di variabili dichiarati in un singolo tipo di unione. La parola chiave utilizzata per dichiarare un'unione è "unione". In C ++, un'unione può contenere sia la funzione membro che le variabili. Per impostazione predefinita, tutti i membri del sindacato sono "pubblici". La dichiarazione dell '"unione" è simile alla dichiarazione della struttura.
union u_type {int x, char c; float f; } u1, u2;
Qui, avevamo dichiarato un sindacato chiamato u_type. I membri di u_type sono "x" di tipo intero, "c" di tipo carattere e "f" di tipo float. Avevamo anche creato le variabili unione "u1" e "u2", di tipo "u_type", subito dopo la dichiarazione di unione. Possiamo anche dichiarare la variabile del sindacato separatamente dalla dichiarazione di un sindacato.
int main () {union u_type u1, u2; // L'unione delle parole chiave non è obbligatoria in C ++. }
L'accesso ai membri dell'unione può essere fatto usando l'operatore punto (.), Preceduto dalla variabile union e seguito il membro di quella variabile.
u1.x = 10;
Come le strutture, l'inizializzazione aggregata non è possibile in un'unione. Come sappiamo l'unione condivide la stessa posizione di memoria per tutto il suo membro alla volta viene inizializzata una sola variabile e tutta la variabile viene automaticamente aggiornata con il valore inizializzato.
u1.x = 10; cout <
Se provi a modificare il valore di qualsiasi membro di "u1". L'altro membro verrà automaticamente aggiornato a quel valore.
u1.c = 65; cout <
Lo spazio assegnato all'unione è uguale alla dimensione del membro più grande dell'unione. Dato che il byte assegnato a "char" è 1 byte, "int" è 4 byte e "float" è 4 byte, quindi la dimensione più grande è 4 byte. Quindi, la memoria assegnata a "u1" e "u2" è di 4 byte.
int main () {int size_1 = sizeof (u1); // 4 int size_2 = sizeof (u2); // 4
Il puntatore all'unione può essere creato esattamente come nella struttura. Il puntatore contiene l'indirizzo dell'unione.
unione u_type * un; UN = & u1; cout < Come la struttura, l'unione può anche essere passata alle funzioni da entrambi i metodi, ovvero chiamata per valore e chiamata per riferimento. Funz (u1); // chiama funzione per chiamata per metodo valore. . . void funct (union u_type un) {// recupera il valore del membro di u1. cout < Ora chiamiamo la funzione usando call per metodo di riferimento. Funz (e u1); // funzione di chiamata per chiamata con il metodo di riferimento. . . void funct (union u_type un) {// richiama l'indirizzo di u1. un-> x = 20. } Esiste un tipo speciale di unione in C ++ chiamata Unione Anonima ”. L'unione anonima non può avere il nome del tipo e non è possibile creare alcuna variabile di tale unione. È solo per dire al compilatore che le sue variabili membro devono condividere la stessa posizione. La variabile di un'unione anonima può essere riferita senza il normale punto (.) Operatore. int main () {union {// definisce l'unione anonima senza il nome del tipo. int x, char c; float f; }; x = 10; // ha fatto riferimento alla variabile union senza out dot cout < Nell'unione anonima non è consentita alcuna funzione membro, non può contenere dati privati o protetti e l'unione anonima globale deve essere specificata come "statica". I punti da ricordare per la normale dichiarazione sindacale. Sia struttura che unione sono il tipo di dati contenitore che contiene il membro di diversi tipi. Ma le strutture vengono utilizzate quando è necessario memorizzare un valore distinto per tutti i membri in una posizione di memoria distinta. I sindacati vengono utilizzati quando è necessaria la conversione del tipo.
Somiglianze:
Conclusione: