陣列名的不作為首元素位址的兩種特殊情況

2021-10-14 04:32:57 字數 1489 閱讀 6850

陣列名在大部分情況下都作為首元素位址,可以通過*(陣列名+i)找到下標為i的元素,但兩種特殊情況除外

情況一:sizeof中單獨放乙個陣列名(必須在定義該陣列的語句塊內部,而非傳參)

int

main

(void);

printf

("%d"

,sizeof

(arr));

return0;

}

程式執行結果為40,使用sizeof(arr)/sizeof(arr[0]);是計算陣列中元素個數的乙個好方法,在這種情況下陣列名就不再代表首元素位址,而是整個陣列所佔位元組數

另寫一段**以作對比

void

test

(int

*arr)

intmain

(void);

printf

("%d\n"

,sizeof

(arr));

test

(arr)

;return0;

}

**執行結果為404

這裡arr的傳參已經退化為了乙個整型指標,所以32位系統下結果為4個位元組

當然,使用陣列接受也一樣,本質沒有區別

void

test

(int arr[10]

)int

main

(void);

printf

("%d\n"

,sizeof

(arr));

test

(arr)

;return0;

}

情況二:對陣列名進行&取位址後的操作

我們知道,對指向陣列元素的指標進行自增運算是跳過乙個元素(所佔位元組數的位址),其實本質是跳過乙個其指標型別大小。對陣列名進行取位址後獲得的是陣列的位址,如果將它和陣列首元素位址以及陣列名列印出來,會發現它們的值是一樣的。但如果對&arr進行+1等操作,就會發現跳過的不是乙個元素的大小,而是乙個陣列的大小。

當然&arr雖然和arr值一樣,*&arr卻不等於arr[0],一次解引用只是相當於找到了首元素位址(arr),只有兩次解引用(**&arr)才可以找到arr[0]

以上就是陣列名不作為首元素位址的兩種特殊情況

指標 陣列名與陣列首元素位址的關係

陣列名等價於等同於指向陣列首元素的指標!作 者 hh 完成日期 2018年7月15日 版本號 v1.0 問題描 指標 陣列名與陣列首個元素位址的關係!輸入描述 程式輸出 includeint main printf d n a 輸出陣列名!printf x n a 輸出16進製制的陣列名!print...

05查詢陣列指定元素的兩種處理思路

public class test boolean flag false flag為定義的哨兵字元 system.out.println 輸出a陣列如下 for int i 0 i a.length i system.out.println scanner scanner new scanner s...

類模板表示陣列中元素數量的兩種方式

模板常用作容器類,為容器類提供可重用 是引入模板的主要動機。在類中使用動態陣列和構造函式引數來提供元素數目 如模板類vector template class stack int stacksize type items public explicit stack int ss size 構造函式引...