Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Unionit | Rakenteiden ja Muistin Ymmärtäminen
C-Rakenteet
Osio 3. Luku 3
single

single

Unionit

Pyyhkäise näyttääksesi valikon

Note
Määritelmä

Union on C-kielessä käyttäjän määrittelemä tietotyyppi, joka muistuttaa rakennetta (structure). Pääasiallinen ero on, että kaikki jäsenet jakavat saman muistipaikan. Kussakin hetkessä vain yksi jäsen voi sisältää arvon.

Unioneita käytetään harvoin, mutta ne ovat hyödyllisiä, kun halutaan muuttuja, joka voi sisältää eri tyyppistä dataa eri aikoina ja samalla säästää muistia.

Data sijaitsee samassa muistialueessa kaikille unionin jäsenille. Tämä tarkoittaa, että kaikki unionin jäsenet jakavat saman muistiosoitteen, ja unionin koko on yhtä suuri kuin sen suurimman jäsenen koko.

struct+vs+union

Unionin pääasiallinen käyttötarkoitus on erilaisten tietotyyppien asettaminen saman muistialueen päälle, eli yhden muistialueen esittäminen eri tietotyyppeinä.

Koska unionissa kentät sijaitsevat samassa muistisolussa, voimme käsitellä samaa dataa eri tavoilla:

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

Esimerkissä muuttujat data.a ja data.b jakavat saman muistin. Annoimme arvon 77 kentälle a, mutta voimme tulkita samat tavut merkkinä kentässä b.

Kohdistus unioneissa

Kuten rakenteissa, myös unioneissa käytetään kohdistusta ja täytebittiä. Kääntäjä voi lisätä ylimääräisiä tavuja, jotta jokainen jäsen alkaa oikeasta muistirajasta.

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

Unioni voi tallentaa vain yhden arvon kerrallaan, ja sen koko on yhtä suuri kuin sen suurimman jäsenen koko. Esimerkissä, jossa on int a (4 tavua), double b (8 tavua) ja char c[20], unionin vähimmäiskoko on 20 tavua. Kääntäjä voi kuitenkin lisätä ylimääräisiä tavuja kohdistusta varten, jotta double tai int alkavat oikeasta muistirajasta. Tämän seurauksena sizeof(union Data) voi olla suurempi kuin 20, esimerkiksi 24 tavua.

Tehtävä

Pyyhkäise aloittaaksesi koodauksen

Union-rakenne Data tallentaa jokaisen arvon int-muodossa ja mahdollistaa pääsyn samaan arvoon myös char-tyyppisenä. Funktion tulee käydä taulukko läpi ja tulostaa jokainen arvo sekä kokonaislukuna että vastaavana ASCII-merkkinä.

Funktio ottaa kaksi parametria: kokonaislukutaulukon (values) ja sen pituuden (n).

  1. Käytä union Data -rakennetta, jossa on kaksi jäsentä: int a ja char b.
  2. Käy taulukon alkiot läpi for-silmukassa indeksistä 0 arvoon n asti.
  3. Aseta nykyinen taulukon alkio unionin int-jäsenelle (data.a).
  4. Tulosta kokonaislukuarvo data.a ja merkkiesitys data.b.

Esimerkki

{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

Ratkaisu

Switch to desktopVaihda työpöytään todellista harjoitusta vartenJatka siitä, missä olet käyttämällä jotakin alla olevista vaihtoehdoista
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

some-alt