變量的定義與賦值
編程語言中有一個比較容易混淆的概念就是“變量的地址”與“變量的值”。因為在編程語言中我們用同一個標(biāo)號來表示這兩個東西,由編譯器根據(jù)上下文判斷它的具體含義。
讓我們看下最簡單的變量的定義與賦值:
int a; // 1
a = 9; // 2
- 第1行,表示定義了一個變量a。對于編譯器來說,編譯器為a分配一個地址,這個地址代表一個存儲空間,空間中存儲的數(shù)據(jù)的類型是
int。 - 第2行,表示賦值,把9賦值給變量a。即程序運行時,通過變量a的地址找到存儲空間,然后向存儲空間中寫入9。
這個存儲空間可以用下圖表示,這里假設(shè)編譯器分配給a的地址為C9420:

image
再來看一組表達式:
int a; // 1
a = 9; // 2
int* b; // 3
b = &a; // 4
- 第1行,見上例。
- 第2行,見上例。
- 第3行,表示定義了一個變量b。對于編譯器來說,編譯器為b分配一個地址,這個地址代表一個存儲空間,空間中存儲的數(shù)據(jù)的類型是
int *。 - 第4行,表示賦值,把a的地址賦值給b。即程序運行時,通過b的地址找到存儲空間,然后向存儲空間中寫入一個數(shù)據(jù),這個數(shù)據(jù)是a的地址。
這個存儲空間可以用下圖表示,這里假設(shè)a的地址為C9420,b的地址為CC004:

image
通過上面兩個例子可以看出來這幾個因素與變量有關(guān):
- 變量的地址
- 變量的值
- 變量的類型
變量的地址用于尋找存儲空間,存儲空間存放變量的值,該值的類型由變量的類型來定義。
sizeof
sizeof不是函數(shù),是c語言中的一元運算符。它用來計算一個對象或者一個數(shù)據(jù)類型所占用的空間大小,單位為char所占用的字節(jié)。
以下例子,我們假設(shè)char類型占用1字節(jié),int占用4字節(jié),指針占用4字節(jié)。
int a = 0;
char b = 't';
char* c = &b;
int arr[9] = {0};
int* p_arr = arr;
printf("%d, %d, %d, %d\n", sizeof(char), sizeof(int), sizeof(char*), sizeof(int*)); // 結(jié)果為 1, 4, 4, 4
printf("%d, %d, %d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(arr), sizeof(p_arr));// 結(jié)果為 4, 1, 4, 36, 4
- int占用4個字節(jié)的存儲空間,a的類型為int,所以
sizeof(a)等于4。 - char占用1個字節(jié)的存儲空間,b的類型為char,所以
sizeof(b)等于1。 - 指針占用4個字節(jié)的存儲空間,c的類型為指針,所以
sizeof(c)等于4。 - arr是一個數(shù)組,
sizeof(arr)計算的是整個數(shù)組占用的空間,所以等于36。 - 指針占用4個字節(jié)的存儲空間,p_arr的類型為指針,所以
sizeof(p_arr)等于4。
再來看結(jié)構(gòu)體的例子:
struct test {
int a;
char b;
};
sizeof(struct test)的結(jié)果可能是8而不是5,這里涉及到字節(jié)對齊。