Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Unioni | Comprendere le Struct e la Memoria
Struct in C
Sezione 3. Capitolo 3
single

single

Unioni

Scorri per mostrare il menu

Note
Definizione

Una union è un tipo di dato definito dall'utente in C, simile a una struttura. La principale differenza è che tutti i suoi membri condividono la stessa posizione di memoria. In qualsiasi momento, solo un membro può contenere un valore.

Le union sono usate raramente, ma sono utili quando si desidera una variabile che possa contenere tipi di dati diversi in momenti diversi risparmiando memoria.

I dati si trovano nella stessa area di memoria per tutti i membri dell'unione. Questo significa che tutti i membri dell'unione condividono lo stesso indirizzo di memoria e la dimensione dell'unione è pari a quella del suo membro più grande.

struct+vs+union

L'uso principale di una union è la sovrapposizione di diversi tipi di dati su una stessa area di memoria, ovvero la rappresentazione di una singola area di memoria come tipi di dati differenti.

Poiché in una union i campi occupano la stessa cella di memoria, è possibile elaborare gli stessi dati in modi diversi:

main.c

main.c

12345678910111213141516
#include <stdio.h> // declaring a union union Data { int a; char b; } data; int main() { data.a = 77; // assigning a value to variable a printf("Value of data.a: %d\n", data.a); printf("Value of data.b: %c\n", data.b); return 0; }

Nell'esempio, le variabili data.a e data.b condividono la stessa memoria. Abbiamo assegnato il valore 77 a a, ma possiamo interpretare gli stessi byte come un carattere in b.

Allineamento nelle union

Come le struct, anche le union utilizzano allineamento e padding. Il compilatore può aggiungere byte extra affinché ogni membro inizi al corretto confine di memoria.

main.c

main.c

12345678910111213
#include <stdio.h> union Data { int a; // 4 bytes double b; // 8 bytes char c[20]; // 20 bytes }; int main() { printf("Size of union Data: %zu bytes\n", sizeof(union Data)); return 0; }

Una union può memorizzare solo un valore alla volta e la sua dimensione è pari a quella del suo membro più grande. Nell'esempio con int a (4 byte), double b (8 byte) e char c[20], la dimensione minima della union è 20 byte. Tuttavia, il compilatore può aggiungere byte extra per l'allineamento, affinché double o int inizino al corretto confine di memoria. Di conseguenza, sizeof(union Data) può essere maggiore di 20, ad esempio 24 byte.

Compito

Scorri per iniziare a programmare

L'unione Data memorizza ciascun valore come int e consente l'accesso allo stesso valore come char. La funzione deve iterare sull'array e stampare ogni valore sia come intero sia come carattere ASCII corrispondente.

La funzione accetta due parametri: un array di interi (values) e la sua lunghezza (n).

  1. Utilizzare una union Data con due membri: int a e char b.
  2. In un ciclo for, iterare sugli elementi dell'array da 0 a n.
  3. Assegnare l'elemento corrente dell'array al membro int dell'unione (data.a).
  4. Stampare il valore intero data.a e la rappresentazione come carattere data.b.

Example

{65, 66, 67, 68, 69} =>

Value as int: 65, Value as char: A
Value as int: 66, Value as char: B
Value as int: 67, Value as char: C
Value as int: 68, Value as char: D
Value as int: 69, Value as char: E

Soluzione

Switch to desktopCambia al desktop per esercitarti nel mondo realeContinua da dove ti trovi utilizzando una delle opzioni seguenti
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3
single

single

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

some-alt