业精于勤,荒于嬉;行成于思,毁于随。
arr[0]是一個一維數組,&arr[0]是指向一維數組的指針,&arr[0]+1也是指向一維數組的指針,*(&arr[0]+1)是一維數組,數組在做右值的時候被自動轉換指針,這是C語言的解釋
arr[0]
&arr[0]
&arr[0]+1
*(&arr[0]+1)
arr[0]是一個數組,&arr[0]是指向數組的指針,其實也可以理解為arr[0]的位址,只不過編譯器知道它的型,所以就叫它指針了。但是實際的記憶體中是沒有一個地方存放&arr[0]或是說arr[0]的位址的。它不像變數b那樣,b被宣告了,編譯器給它分配了記憶體空間,所以可以用取址&取到b的位址。
b
&
arr是數組,它的每個成員是一個數組int [2],每個成員的長度8個字節,arr + 1在做這個運算的時候被轉換成了指向數組的指針int (*)[2],所以arr + 1的值就是數組arr的地址+8,它不光是一個地址,而且編譯器知道它指向的數據的類型,這個在C語言的概念裡就是指針了。所以*(arr+1)就是arr[1]了。
arr
int [2]
arr + 1
int (*)[2]
*(arr+1)
arr[1]
*(arr+1)就是表示的記憶體裡的內容,但是呢這個內容又恰好是一個數組,數組被自動轉換成了指向數組成員的指針,所以打印出來的是地址。如果是int arr1[2],那麼*(arr1 + 1)就不一樣了。
int arr1[2]
*(arr1 + 1)
&arr[0] 相当于 arr &arr[0] + 1 相当于 arr + 1 *(arr + 1) 相当于 arr[1] 所以还是地址
相關題目
arr[0]
是一個一維數組,&arr[0]
是指向一維數組的指針,&arr[0]+1
也是指向一維數組的指針,*(&arr[0]+1)
是一維數組,數組在做右值的時候被自動轉換指針,這是C語言的解釋arr[0]
是一個數組,&arr[0]
是指向數組的指針,其實也可以理解為arr[0]
的位址,只不過編譯器知道它的型,所以就叫它指針了。但是實際的記憶體中是沒有一個地方存放&arr[0]
或是說arr[0]
的位址的。它不像變數b
那樣,b
被宣告了,編譯器給它分配了記憶體空間,所以可以用取址&
取到b
的位址。arr
是數組,它的每個成員是一個數組int [2]
,每個成員的長度8個字節,arr + 1
在做這個運算的時候被轉換成了指向數組的指針int (*)[2]
,所以arr + 1
的值就是數組arr
的地址+8,它不光是一個地址,而且編譯器知道它指向的數據的類型,這個在C語言的概念裡就是指針了。所以*(arr+1)
就是arr[1]
了。*(arr+1)
就是表示的記憶體裡的內容,但是呢這個內容又恰好是一個數組,數組被自動轉換成了指向數組成員的指針,所以打印出來的是地址。如果是int arr1[2]
,那麼*(arr1 + 1)
就不一樣了。相關題目