Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Unioni | Comprendere Struct e Memoria
Padronanza delle Struct in C

bookUnioni

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 ogni momento, solo un membro può contenere un valore.

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

I dati sono situati nella stessa area di memoria per tutti i membri della union. Questo significa che tutti i membri della union condividono lo stesso indirizzo di memoria e la dimensione della union è pari a quella del suo membro più grande.

L'uso principale di una union è l'imposizione di diversi tipi di dati su un'unica area di memoria comune, ovvero la rappresentazione di una stessa 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

copy
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 area di memoria. È stato assegnato il valore 77 a a, ma è possibile interpretare gli stessi byte come un carattere in b.

Allineamento nelle union

Come per le strutture, 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

copy
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 è di 20 byte. Tuttavia, il compilatore può aggiungere byte extra per l'allineamento, in modo che double o int inizino al corretto confine di memoria. Di conseguenza, sizeof(union Data) può essere maggiore di 20, ad esempio 24 byte.

Compito

Swipe to start coding

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

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

Suggested prompts:

Can you explain more about how unions save memory compared to structs?

What are some practical examples where using a union is beneficial?

How does alignment and padding affect the size of a union?

close

bookUnioni

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 ogni momento, solo un membro può contenere un valore.

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

I dati sono situati nella stessa area di memoria per tutti i membri della union. Questo significa che tutti i membri della union condividono lo stesso indirizzo di memoria e la dimensione della union è pari a quella del suo membro più grande.

L'uso principale di una union è l'imposizione di diversi tipi di dati su un'unica area di memoria comune, ovvero la rappresentazione di una stessa 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

copy
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 area di memoria. È stato assegnato il valore 77 a a, ma è possibile interpretare gli stessi byte come un carattere in b.

Allineamento nelle union

Come per le strutture, 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

copy
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 è di 20 byte. Tuttavia, il compilatore può aggiungere byte extra per l'allineamento, in modo che double o int inizino al corretto confine di memoria. Di conseguenza, sizeof(union Data) può essere maggiore di 20, ad esempio 24 byte.

Compito

Swipe to start coding

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

some-alt