C 陣列指標

2021-12-29 20:48:23 字數 1338 閱讀 7336

首先看下陣列int arr[2][3]在除錯時的情況:

再看下陣列對應的**:

#include

using namespace std;

void main()

; int (*p)[3] = arr;

}   

分析二維陣列int arr[2][3],它在記憶體中是順序儲存,分別按照行列來存貯,從arr下拉的可以看出,arr直接的有兩個元素,分別是arr[0],arr[1],可以看出其型別是 int[3],這是乙個陣列,那麼arr[0],arr[1]就代表著兩個陣列,表示的陣列的首元素位址。

至於arr = arr[0] = &arr[0][0] = arr +0,以及arr + 1 =arr[1] 這些都還好理解。關鍵是 &arr[1] = arr[1] =*(arr + 1),這個該怎麼理解呢。arr[1] 表示陣列arr的首位址加上乙個偏移量所指向的值,即*(arr + 1),所以*(arr + 1) = arr[1] = arr +1,這就是陣列中指標的感覺有點奇怪的地方吧。其實本來就是這樣,我們還可以這樣理解,陣列中的元素是按順序儲存的,那麼arr + 1表示的第1(0,1)個元素的位址。*(arr + 1)表示的第1個元素的值,因為第乙個元素是陣列,那麼陣列的值使用首元素的位址表示的,那麼對其進行解引用操作,結果肯定就是arr+ 1自身表示的位址了。或許有人感到奇怪,為什麼*(arr + 1)代表的不是(arr+1)處的即第一行首元素的位址呢。我是這麼思考的,arr + 1 所指的型別是int,所以其解析成位址,而arr[1][0]的位址雖然是和arr + 1相同,但是兩者表示的型別的不同。

我們知道&只是個取位址符號,如果針對乙個一維陣列來說,&a[i]表示的是第i個元素的位址,這個毫無疑問,但是針對多維陣列呢?在陣列 arr[2][3]中,arr[1]表示的第乙個元素的位址,也可以說是表示第1行陣列,&arr[1]表示的是什麼東西呢,這個問題的本質其實就是陣列名,對陣列名取位址兩者的區別。看下面的程式

#include

using namespace std;

void main()

; cout<

再看結果:

我們發現,brr表示的位址和&brr表示的位址兩者相同,但是對兩者進行+1操作的話,會發現,brr只是加了4個位元組,但&brr卻是加了4x3個位元組(整個陣列的大小)。到現在應該明白了兩者的區別了吧,brr陣列名表示位址,但是只等同於&brr[0],即,&brr表示的是整個陣列的位址,兩者雖然數值一樣,但是型別不一樣。

其實這裡涉及到了乙個隱式轉換的問題。對於c++中的陣列,除了在sizeof(array),&array外,陣列名array都會被自動轉換成&array[0].

c 陣列指標 指標陣列 函式指標

優先順序比 高,低於 根據這個原則去判斷 陣列指標 陣列指標即陣列的指標,是乙個指標,指向乙個陣列 也稱為行指標 int p 2 可以理解為int 2 p,但是不能這樣子定義 p是乙個指標,指向乙個陣列,陣列元素是int長度為2 二維陣列可以賦值給陣列指標 int a 3 4 int p 4 p a...

C 指標陣列與陣列指標

說實話,c語言真的很讓人蛋疼,它不像物件導向的語言,我們重心在設計程式上。而使用c語言,你不僅要考慮程式的設計,你還要考慮很多他的使用細節,不然一不小心你怎麼死的都不知道。但是,個人感覺,c語言的魅力是其他任何語言都比不了的!繼續看。陣列指標 範例 typedef int aint5 5 typed...

C指標陣列和陣列指標

測試 int main 定義二維陣列m並初始化 int p 4 陣列指標 p是指標,指向一維陣列,每個一維陣列有4個int元素 int i,j int q 3 指標陣列 q是陣列,陣列元素是指標,3個int指標 p m p是指標,可以直接指向二維陣列 printf 陣列指標輸出元素 n for i ...