Unionit
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
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
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.
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).
- Käytä
union Data-rakennetta, jossa on kaksi jäsentä:int ajachar b. - Käy
for-silmukassa taulukon alkiot läpi indeksistä0arvoonnasti. - Aseta nykyinen taulukon alkio unionin
int-jäseneen (data.a). - Tulosta kokonaislukuarvo
data.aja merkkiesitysdata.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
Kiitos palautteestasi!
single
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Mahtavaa!
Completion arvosana parantunut arvoon 4.35
Unionit
Pyyhkäise näyttääksesi valikon
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
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
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.
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).
- Käytä
union Data-rakennetta, jossa on kaksi jäsentä:int ajachar b. - Käy
for-silmukassa taulukon alkiot läpi indeksistä0arvoonnasti. - Aseta nykyinen taulukon alkio unionin
int-jäseneen (data.a). - Tulosta kokonaislukuarvo
data.aja merkkiesitysdata.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
Kiitos palautteestasi!
single