Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Unioner | Förståelse för Structs och Minne
C-Strukturer
Avsnitt 3. Kapitel 3
single

single

Unioner

Svep för att visa menyn

Note
Definition

En union är en användardefinierad datatyp i C, liknande en struktur. Den största skillnaden är att alla dess medlemmar delar samma minnesplats. Vid varje givet tillfälle kan endast en medlem lagra ett värde.

Unioner används sällan, men de är användbara när du vill ha en variabel som kan innehålla olika datatyper vid olika tillfällen och samtidigt spara minne.

Data lagras i samma minnesområde för alla medlemmar i unionen. Detta innebär att alla medlemmar i unionen delar samma minnesadress, och storleken på unionen är lika med storleken på dess största medlem.

struct+vs+union

Huvudanvändningen av union är att tillåta olika datatyper att använda ett gemensamt minnesområde, det vill säga att representera ett minnesområde som olika datatyper.

Eftersom fälten i en union delar samma minnescell kan vi bearbeta samma data på olika sätt:

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; }

I exemplet delar variablerna data.a och data.b samma minne. Vi tilldelade värdet 77 till a, men vi kan tolka samma byte som ett tecken i b.

Justering i unioner

Precis som strukturer använder unioner också justering och utfyllnad. Kompilatorn kan lägga till extra byte så att varje medlem börjar vid rätt minnesgräns.

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; }

En union kan endast lagra ett värde åt gången, och dess storlek är lika med storleken på dess största medlem. I exemplet med int a (4 byte), double b (8 byte) och char c[20] är minsta storleken på unionen 20 byte. Kompilatorn kan dock lägga till extra byte för justering, så att double eller int börjar vid rätt minnesgräns. Som ett resultat kan sizeof(union Data) vara större än 20, till exempel 24 byte.

Uppgift

Svep för att börja koda

Unionen Data lagrar varje värde som en int och möjliggör åtkomst till samma värde som en char. Funktionen ska iterera över arrayen och skriva ut varje värde både som ett heltal och som motsvarande ASCII-tecken.

Funktionen tar emot två parametrar: en array av heltal (values) och dess längd (n).

  1. Använd en union Data med två medlemmar: int a och char b.
  2. Iterera över arrayens element från for till 0 med en n-slinga.
  3. Tilldela det aktuella elementet i arrayen till unionens int-medlem (data.a).
  4. Skriv ut heltalsvärdet data.a och teckenrepresentationen data.b.

Exempel

{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

Lösning

Switch to desktopByt till skrivbordet för praktisk övningFortsätt där du är med ett av alternativen nedan
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3
single

single

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

some-alt