Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Unionit | Rakennerakenteiden ja Muistin Ymmärtäminen
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
C-Rakenteiden Hallinta

bookUnionit

Note
Määritelmä

Union on käyttäjän määrittelemä tietotyyppi C-kielessä, joka muistuttaa rakennetta. 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 tietotyyppejä eri aikoina ja säästää muistia.

Kaikkien unionin jäsenten tiedot sijaitsevat samassa muistialueessa. Tämä tarkoittaa, että kaikki unionin jäsenet jakavat saman muistiosoitteen, ja unionin koko on yhtä suuri kuin sen suurimman jäsenen koko.

Unionin pääasiallinen käyttötarkoitus on erilaisten tietotyyppien asettaminen saman yhteisen 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

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

Esimerkissä muuttujat data.a ja data.b jakavat saman muistin. Annoimme arvon 77 muuttujalle a, mutta voimme tulkita samat tavut merkkinä muuttujassa 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

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

Union 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 kohdistuksen vuoksi, jotta double tai int alkavat oikeasta muistirajasta. Tämän seurauksena sizeof(union Data) voi olla suurempi kuin 20, esimerkiksi 24 tavua.

Tehtävä

Swipe to start coding

Unionin Data avulla jokainen arvo tallennetaan int-tyyppisenä ja mahdollistaa saman arvon tarkastelun 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 for-silmukassa taulukon alkiot läpi indeksistä 0 arvoon n asti.
  3. Aseta nykyinen taulukon alkio unionin int-jäseneen (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

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

close

bookUnionit

Pyyhkäise näyttääksesi valikon

Note
Määritelmä

Union on käyttäjän määrittelemä tietotyyppi C-kielessä, joka muistuttaa rakennetta. 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 tietotyyppejä eri aikoina ja säästää muistia.

Kaikkien unionin jäsenten tiedot sijaitsevat samassa muistialueessa. Tämä tarkoittaa, että kaikki unionin jäsenet jakavat saman muistiosoitteen, ja unionin koko on yhtä suuri kuin sen suurimman jäsenen koko.

Unionin pääasiallinen käyttötarkoitus on erilaisten tietotyyppien asettaminen saman yhteisen 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

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

Esimerkissä muuttujat data.a ja data.b jakavat saman muistin. Annoimme arvon 77 muuttujalle a, mutta voimme tulkita samat tavut merkkinä muuttujassa 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

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

Union 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 kohdistuksen vuoksi, jotta double tai int alkavat oikeasta muistirajasta. Tämän seurauksena sizeof(union Data) voi olla suurempi kuin 20, esimerkiksi 24 tavua.

Tehtävä

Swipe to start coding

Unionin Data avulla jokainen arvo tallennetaan int-tyyppisenä ja mahdollistaa saman arvon tarkastelun 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 for-silmukassa taulukon alkiot läpi indeksistä 0 arvoon n asti.
  3. Aseta nykyinen taulukon alkio unionin int-jäseneen (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

some-alt