變量的地址與變量的值 | C語言

變量的定義與賦值

編程語言中有一個比較容易混淆的概念就是“變量的地址”與“變量的值”。因為在編程語言中我們用同一個標(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é)對齊。

更多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容