sizeof和 取位址

2021-08-21 23:39:14 字數 1794 閱讀 7310

我們知道通過sizeof可以求得乙個變數的大小,通過&符號可以取乙個變數的位址,那當它們對乙個變數或者陣列操作時又有何不同呢?

首先,sizeof不是函式,而是乙個表示式,可以求變數或者型別所佔空間的大小.

1).變數

sizeof求變數的大小時可以不加(),如:sizeof a;但是求型別必須加(),sizeof(int) 。

對乙個int型別的變數大小為多少呢?通過sizeof我們可以看出:

int s = 9;

printf("%d\n",s);

結果為:4

2). 陣列

sizeof也可以求乙個陣列的大小,當sizeof(陣列名)時,陣列名表示整個陣列,表示式求的是整個陣列的大小,單位是位元組。

例如: 

int arr[4] = ;

printf("%d\n,sizeof(arr));

這個陣列的大小是:4 * 4 = 16

&取位址,表示取某乙個變數的位址。

1).變數

可以將乙個變數的位址以不同的形式列印出來。

int a = 10;

printf("%p\n",&a);//將a的位址以滿位址的形式列印出來

printf("%x\n",&a);//將a的位址以十六進製制形式列印出來

2). 陣列

同樣的,&也可以作用於陣列:

例如:

int arr[10] = ;

printf("%p\n",&arr);//表示整個陣列的位址,陣列名表示整個陣列

printf("%p\n",&arr + 1);// +1表示跳過整個陣列

printf("%p\n",arr);//表示陣列首元素的位址

printf("%p\n",arr + 1);//+1表示跳過陣列中的乙個元素

結果:

注意:sizeof(陣列名),陣列名表示整個陣列,表示式求的是整個陣列的大小,單位是位元組;&陣列名,陣列名表示整個陣列,表示求的是上述整個陣列的位址,除過上述兩種情況,他所有的陣列名都是首元素的位址。

來看下面這個例子,我的編譯器是32位的。

int a = ;

printf("%d\n",sizeof(a));//陣列名,表示整個陣列的大小 16

printf("%d\n",sizeof(a+0));//表示第乙個元素的位址 8

printf("%d\n",sizeof(*a));//代表第乙個元素 4

printf("%d\n",sizeof(a+1));//代表第二個元素的位址 8

printf("%d\n",sizeof(a[1]));//代表第二個元素 4

printf("%d\n",sizeof(&a));//表示整個陣列的位址 8

printf("%d\n",sizeof(&a+1));//第乙個元素的第二個位元組的位址 8

printf("%d\n",sizeof(&a[0]));//表示是第乙個元素的位址 8

printf("%d\n",sizeof(&a[0]+1));//第乙個元素第二個位元組的位址 8

引用和取位址區別

乙個是用來傳值的 乙個是用來獲取首位址的 引用 出現在變數宣告語句中位於變數左邊時,表示宣告的是引用.例如 int rf 宣告乙個int型的引用rf.取位址運算子 在給變數賦初值時出現在等號右邊或在執行語句中作為一元運算子出現時 表示取物件的位址.1 引用在賦值 的左邊,而取位址在賦值的右邊,比如 ...

ADR ADRL LDR取位址區別

文章 網路文章 1 adr偽指令 小範圍的位址讀取 adr偽指令將基於pc相對偏移的位址值或基於暫存器相對偏移的位址值讀取到暫存器中。在彙編編譯器編譯源程式時,adr偽指令被編譯器替換成一條合適的指令。通常,編譯器 用一條add指令或sub指令來實現該adr偽指令的功能,若不能用一條指令實現,則產生...

C 中「 引用」和「 取位址」的區別

作用上的不同 作為引用是某一變數 目標 的乙個別名,必須在定義時候就進行初始化,若不進行初始化則會編譯報錯。作為取位址時,用來獲取指標指向的元素所在記憶體中的位址值。int a 3 int b a 引用 int p a 取位址 問題的參 如下 include include include incl...