C語(yǔ)言?sizeof關(guān)鍵字的具體使用
在 C 語(yǔ)言中,sizeof 是一個(gè)非常常用的關(guān)鍵字,它可以用來(lái)獲取某個(gè)數(shù)據(jù)類型或變量所占用的字節(jié)數(shù)。sizeof 的結(jié)果是一個(gè)無(wú)符號(hào)整數(shù),通常用 size_t 類型來(lái)表示。sizeof 可以用于任何數(shù)據(jù)類型,包括基本類型、指針類型、數(shù)組類型、結(jié)構(gòu)體類型、聯(lián)合體類型等。本文將介紹 sizeof 關(guān)鍵字的語(yǔ)法、用法、特點(diǎn)和注意事項(xiàng)。
sizeof 的語(yǔ)法
sizeof 的語(yǔ)法有兩種形式,一種是用括號(hào)括起來(lái)的類型名,另一種是用括號(hào)括起來(lái)的表達(dá)式。例如:
sizeof(int) // 獲取 int 類型的字節(jié)數(shù) sizeof(a) // 獲取變量 a 的字節(jié)數(shù) sizeof(a + b) // 獲取表達(dá)式 a + b 的字節(jié)數(shù)
注意,當(dāng) sizeof 的操作數(shù)是一個(gè)表達(dá)式時(shí),它并不會(huì)計(jì)算表達(dá)式的值,而只是根據(jù)表達(dá)式的類型來(lái)確定字節(jié)數(shù)。例如:
int a = 10; int b = 20; sizeof(a++) // 獲取 a 的字節(jié)數(shù),不會(huì)改變 a 的值 sizeof(a + b) // 獲取 a + b 的字節(jié)數(shù),不會(huì)計(jì)算 a + b 的值
sizeof 的用法
sizeof 的用法主要有以下幾種:
- 用于獲取數(shù)據(jù)類型的字節(jié)數(shù),例如:
printf("%lu\n", sizeof(char)); // 輸出 1 printf("%lu\n", sizeof(int)); // 輸出 4 printf("%lu\n", sizeof(double)); // 輸出 8
注意,不同的編譯器和平臺(tái)可能會(huì)給出不同的結(jié)果,因?yàn)?C 語(yǔ)言標(biāo)準(zhǔn)并沒有規(guī)定每種數(shù)據(jù)類型的字節(jié)數(shù),只是規(guī)定了它們的最小范圍。一般來(lái)說(shuō),char 類型的字節(jié)數(shù)是 1,short 類型的字節(jié)數(shù)是 2,int 和 float 類型的字節(jié)數(shù)是 4,long 和 double 類型的字節(jié)數(shù)是 8,long long 和 long double 類型的字節(jié)數(shù)是 16。
- 用于獲取變量的字節(jié)數(shù),例如:
int a = 10; char b = 'A'; double c = 3.14; printf("%lu\n", sizeof(a)); // 輸出 4 printf("%lu\n", sizeof(b)); // 輸出 1 printf("%lu\n", sizeof(c)); // 輸出 8
注意,當(dāng)變量是一個(gè)數(shù)組時(shí),sizeof 會(huì)返回?cái)?shù)組的總字節(jié)數(shù),而不是數(shù)組的長(zhǎng)度。例如:
int arr[10]; printf("%lu\n", sizeof(arr)); // 輸出 40 printf("%lu\n", sizeof(arr) / sizeof(arr[0])); // 輸出 10,計(jì)算數(shù)組的長(zhǎng)度
- 用于獲取指針的字節(jié)數(shù),例如:
int *p; char *q; double *r; printf("%lu\n", sizeof(p)); // 輸出 4 或 8,取決于平臺(tái) printf("%lu\n", sizeof(q)); // 輸出 4 或 8,取決于平臺(tái) printf("%lu\n", sizeof(r)); // 輸出 4 或 8,取決于平臺(tái)
注意,當(dāng)指針指向一個(gè)數(shù)組時(shí),sizeof 會(huì)返回指針的字節(jié)數(shù),而不是數(shù)組的字節(jié)數(shù)。例如:
int arr[10]; int *p = arr; printf("%lu\n", sizeof(arr)); // 輸出 40 printf("%lu\n", sizeof(p)); // 輸出 4 或 8,取決于平臺(tái)
- 用于獲取結(jié)構(gòu)體或聯(lián)合體的字節(jié)數(shù),例如:
struct student { char name[20]; int age; double score; }; union data { int a; char b; double c; }; struct student s; union data d; printf("%lu\n", sizeof(s)); // 輸出 32 或 40,取決于平臺(tái)和對(duì)齊方式 printf("%lu\n", sizeof(d)); // 輸出 8
注意,當(dāng)結(jié)構(gòu)體或聯(lián)合體中有數(shù)組或指針時(shí),sizeof 會(huì)返回結(jié)構(gòu)體或聯(lián)合體的總字節(jié)數(shù),而不是數(shù)組或指針的字節(jié)數(shù)。例如:
struct student { char *name; int age; double score; }; union data { int a; char b[10]; double c; }; struct student s; union data d; printf("%lu\n", sizeof(s)); // 輸出 16 或 24,取決于平臺(tái) printf("%lu\n", sizeof(d)); // 輸出 16
sizeof 的特點(diǎn)
sizeof 的特點(diǎn)有以下幾點(diǎn):
- sizeof 是一個(gè)編譯時(shí)的操作符,它在編譯時(shí)就會(huì)計(jì)算出操作數(shù)的字節(jié)數(shù),而不會(huì)在運(yùn)行時(shí)進(jìn)行計(jì)算。
- sizeof 的結(jié)果是一個(gè)無(wú)符號(hào)整數(shù),通常用 size_t 類型來(lái)表示,它在頭文件中定義為:
typedef unsigned int size_t;
- sizeof 的優(yōu)先級(jí)比算術(shù)運(yùn)算符高,但比括號(hào)運(yùn)算符低。例如:
int a = 10; int b = 20; printf("%lu\n", sizeof(a + b)); // 輸出 4 printf("%lu\n", sizeof a + b); // 輸出 24
- sizeof 可以用于分配動(dòng)態(tài)內(nèi)存,例如:
int *p = (int *)malloc(10 * sizeof(int)); // 分配 10 個(gè) int 類型的空間
- sizeof 可以用于讀取文件,例如:
FILE *fp = fopen("test.txt", "r"); char buffer[100]; size_t n = fread(buffer, sizeof(char), 100, fp); // 讀取 100 個(gè) char 類型的數(shù)據(jù)
sizeof 的注意事項(xiàng)
sizeof 的注意事項(xiàng)有以下幾點(diǎn):
- sizeof 不能用于函數(shù)類型、不完全類型或位字段。不完全類型指具有未知存儲(chǔ)大小的數(shù)據(jù)類型,如未知大小的數(shù)組類型、未知內(nèi)容的結(jié)構(gòu)體或聯(lián)合體類型、void 類型等。例如:
int max(int a, int b); int arr[]; struct student; void f(void); sizeof(max) // 錯(cuò)誤,函數(shù)類型 sizeof(arr) // 錯(cuò)誤,不完全類型 sizeof(struct student) // 錯(cuò)誤,不完全類型 sizeof(void) // 錯(cuò)誤,不完全類型 sizeof(f) // 錯(cuò)誤,函數(shù)類型
- sizeof 不能用于計(jì)算字符串的長(zhǎng)度,因?yàn)樽址且?‘\0’ 結(jié)尾的字符數(shù)組,而 sizeof 會(huì)計(jì)算 ‘\0’ 的字節(jié)數(shù)。例如:
char str[] = "Hello"; printf("%lu\n", sizeof(str)); // 輸出 6 printf("%lu\n", strlen(str)); // 輸出 5
- sizeof 不能用于判斷兩個(gè)變量是否相等,因?yàn)?sizeof 只能獲取變量的字節(jié)數(shù),而不是變量的值。例如:
int a = 10; int b = 20; if (sizeof(a) == sizeof(b)) // 總是成立,因?yàn)?a 和 b 的字節(jié)數(shù)都是 4 { printf("a and b are equal\n"); } else { printf("a and b are not equal\n"); }
總結(jié)
本文介紹了 C 語(yǔ)言中 sizeof 關(guān)鍵字的語(yǔ)法、用法、特點(diǎn)和注意事項(xiàng),以及一些常見的例子。sizeof 是一個(gè)非常有用的關(guān)鍵字,它可以用來(lái)獲取數(shù)據(jù)類型或變量的字節(jié)數(shù),從而進(jìn)行一些內(nèi)存分配、文件讀寫、數(shù)組長(zhǎng)度計(jì)算等操作。
到此這篇關(guān)于C語(yǔ)言 sizeof關(guān)鍵字的具體使用的文章就介紹到這了,更多相關(guān)C語(yǔ)言 sizeof關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ vector容器 find erase的使用操作:查找并刪除指定元素
這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05C++使用map實(shí)現(xiàn)多進(jìn)程拷貝文件的程序思路
這篇文章主要介紹了C++使用mmap實(shí)現(xiàn)多進(jìn)程拷貝文件,通過(guò)本文給大家分享程序思路及完整代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12C語(yǔ)言中 int main(int argc,char *argv[])的兩個(gè)參數(shù)詳解
這篇文章主要介紹了C語(yǔ)言中 int main(int argc,char *argv[])的兩個(gè)參數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03C++中based for循環(huán)的實(shí)現(xiàn)
C++中的范圍for循環(huán)是一種簡(jiǎn)潔的遍歷容器的方法,本文主要介紹了C++中based for循環(huán)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02C++ 詳細(xì)講解stack與queue的模擬實(shí)現(xiàn)
C++ Stack(堆棧) 是一個(gè)容器類的改編,為程序員提供了堆棧的全部功能,也就是說(shuō)實(shí)現(xiàn)了一個(gè)先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了 queue 容器。queue 容器可以用來(lái)表示超市的結(jié)賬隊(duì)列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫(kù)事務(wù)隊(duì)列2022-04-04