柚子快報激活碼778899分享:開發(fā)語言 C語言共用體詳解
柚子快報激活碼778899分享:開發(fā)語言 C語言共用體詳解
文章目錄
共用體解釋代碼說明小端存儲 Little Endian共用體與小端存儲為什么只能用第一個成員類型的值初始化一個共用體變量
共用體解釋
共用體(Union)是一種特殊的數(shù)據(jù)類型, 它允許在同一個內(nèi)存位置存儲不同的數(shù)據(jù)類型。 共用體的所有成員共享同一塊內(nèi)存空間, 因此同一時間只能存儲其中一個成員的值。
共用體的定義和結(jié)構(gòu)體類似,使用關(guān)鍵字union,后面跟著成員列表。 每個成員可以是不同的數(shù)據(jù)類型, 但共用體的所有成員都共享同一塊內(nèi)存空間,大小取決于最大的成員。
共用體的成員可以通過點操作符(.)或箭頭操作符(->)來訪問。
共用體的主要特點如下:
共用體的大小取決于最大的成員的大小。共用體的成員共享同一塊內(nèi)存空間,只能同時存儲其中一個成員的值。對共用體的任何成員的修改都會影響到其他成員。共用體的成員可以具有不同的數(shù)據(jù)類型,但它們在內(nèi)存中的起始位置是相同的。
共用體的主要用途有:
節(jié)省內(nèi)存空間:當(dāng)多個成員變量不會同時使用,但需要共享同一塊內(nèi)存空間時,可以使用共用體來節(jié)省內(nèi)存。數(shù)據(jù)類型轉(zhuǎn)換:共用體可以用于不同類型之間的轉(zhuǎn)換,通過存儲一個成員變量,然后通過另一個成員變量來讀取轉(zhuǎn)換后的值。
需要注意的是,由于共用體的成員共享同一塊內(nèi)存空間,因此在使用共用體時需要謹(jǐn)慎處理成員的賦值和讀取操作,以免出現(xiàn)意外的結(jié)果。
代碼說明
#include
// 定義一個共用體
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 修改共用體的成員
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 3.14;
printf("data.f: %f\n", data.f);
strcpy(data.str, "Hello");
printf("data.str: %s\n", data.str);
// 訪問共用體的成員
printf("data.i: %d\n", data.i);
printf("data.f: %f\n", data.f);
printf("data.str: %s\n", data.str);
return 0;
}
輸出
data.i: 10
data.f: 3.140000
data.str: Hello
data.i: 1819043144
data.f: 1143139122437582500000000000.000000
data.str: Hello
小端存儲 Little Endian
小端存儲(Little Endian)是一種計算機(jī)存儲數(shù)據(jù)的方式, 其中較低有效字節(jié)(即數(shù)值的最低位字節(jié))存儲在較低的內(nèi)存地址, 而較高有效字節(jié)存儲在較高的內(nèi)存地址。
在小端存儲中,多字節(jié)數(shù)據(jù)類型(如整數(shù)或浮點數(shù))的字節(jié)順序是從低位到高位。
例如,對于一個16位整數(shù)0x1234,存儲在內(nèi)存中的字節(jié)順序是0x34(低地址)和0x12(高地址)。
小端存儲的特點是:
較低有效字節(jié)存儲在較低的內(nèi)存地址,較高有效字節(jié)存儲在較高的內(nèi)存地址。對于多字節(jié)數(shù)據(jù)類型,字節(jié)的順序是從低位到高位??梢酝ㄟ^簡單的指針操作來訪問和操作多字節(jié)數(shù)據(jù)類型的各個字節(jié)。
下面是一個示例代碼,用于說明C語言中小端存儲的特點:
#include
int main() {
unsigned int num = 0x12345678;
unsigned char *ptr = (unsigned char*)#
printf("num: 0x%x\n", num);
printf("Byte order: ");
for (int i = 0; i < sizeof(num); i++) {
printf("%02x ", *(ptr + i));
}
printf("\n");
return 0;
}
在上述代碼中,我們定義了一個無符號整數(shù)num,并將其賦值為0x12345678。 然后,我們使用一個指向num的無符號字符指針ptr。
通過循環(huán)遍歷指針ptr,我們打印出num中每個字節(jié)的值。 根據(jù)小端存儲的特點,輸出結(jié)果應(yīng)該是:
num: 0x12345678 Byte order: 78 56 34 12
從輸出結(jié)果可以看出,較低有效字節(jié)0x78存儲在較低的內(nèi)存地址,較高有效字節(jié)0x12存儲在較高的內(nèi)存地址,符合小端存儲的字節(jié)順序。
unsigned int num = 0x12345678; 十六進(jìn)制的一個數(shù)字即4bit, 兩個數(shù)字為8bit = 1Byte char類型為1Byte, 即每次可以取出2個數(shù)字 所以是 78 56 34 12
在實際編程中,我們需要注意小端存儲的影響,特別是在處理網(wǎng)絡(luò)通信、文件IO和數(shù)據(jù)轉(zhuǎn)換等場景下,需要正確處理字節(jié)順序的轉(zhuǎn)換。
大端存儲與之相反, 這里不做介紹
共用體與小端存儲
void test() {
union {
short int i;
char d[2];
}r, *s=&r;
s->i = 0x1234;
printf("%x\n", s->i); // 1234
printf("%x, %x\n", s->d[0], s->d[1]); // 34, 12
}
為什么只能用第一個成員類型的值初始化一個共用體變量
在C語言中,共用體(union)的所有成員共享同一塊內(nèi)存空間。
因此,共用體的大小和內(nèi)存布局是根據(jù)它的成員類型來確定的。
當(dāng)我們初始化一個共用體變量時,需要指定其中一個成員的值, 這樣編譯器才知道如何正確地分配內(nèi)存和解釋這塊內(nèi)存中的內(nèi)容。
由于共用體的所有成員共享同一塊內(nèi)存, 因此使用不同類型的值來初始化共用體變量可能會導(dǎo)致問題。 如果我們使用非第一個成員類型的值來初始化共用體變量, 編譯器無法準(zhǔn)確地確定應(yīng)該如何解釋這塊內(nèi)存中的內(nèi)容。 這可能會導(dǎo)致未定義的行為, 例如訪問無效的內(nèi)存或得到不正確的結(jié)果。
因此,為了確保正確的內(nèi)存布局和避免未定義的行為, C語言規(guī)定只能使用第一個成員類型的值來初始化共用體變量。
第一個成員類型的值來初始化 第一個成員類型的值來初始化 第一個成員類型的值來初始化
這樣編譯器就能正確地分配內(nèi)存, 并根據(jù)第一個成員類型來解釋這塊內(nèi)存中的內(nèi)容。
柚子快報激活碼778899分享:開發(fā)語言 C語言共用體詳解
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。