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 av Structs och Minne
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Behärska C-Strukturer

bookUnioner

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 typer av data vid olika tillfällen och samtidigt spara minne.

Datan är placerad 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.

Huvudsyftet med en union är att tillåta olika datatyper att dela samma 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 behandla samma data på olika sätt:

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

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

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

En union kan endast lagra ett värde åt gången, och dess storlek motsvarar storleken på dess största medlem. I exemplet med int a (4 byte), double b (8 byte) och char c[20], är unionens minsta storlek 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. Därför kan sizeof(union Data) vara större än 20, till exempel 24 byte.

Uppgift

Swipe to start coding

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-loop.
  3. Tilldela det aktuella elementet i arrayen till unionens int-medlem (data.a).
  4. Skriv ut heltalsvärdet data.a och teckenrepresentationen 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

Lösning

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

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

bookUnioner

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 typer av data vid olika tillfällen och samtidigt spara minne.

Datan är placerad 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.

Huvudsyftet med en union är att tillåta olika datatyper att dela samma 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 behandla samma data på olika sätt:

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

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

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

En union kan endast lagra ett värde åt gången, och dess storlek motsvarar storleken på dess största medlem. I exemplet med int a (4 byte), double b (8 byte) och char c[20], är unionens minsta storlek 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. Därför kan sizeof(union Data) vara större än 20, till exempel 24 byte.

Uppgift

Swipe to start coding

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-loop.
  3. Tilldela det aktuella elementet i arrayen till unionens int-medlem (data.a).
  4. Skriv ut heltalsvärdet data.a och teckenrepresentationen 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

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

some-alt