首先我們看下面**:
#include
intmain()
;printf
("%p\n"
, arr)
;printf
("%p\n"
,&arr)
;printf
("arr+1 = %p\n"
, arr+1)
;printf
("&arr+1= %p\n"
,&arr+1)
;return0;
}
根據上面的**我們發現,其實&arr和arr,雖然值是一樣的,但是意義應該不一樣的。
arr表示陣列首元素的位址,而 &arr 表示的是陣列的位址,而不是陣列首元素的位址。
arr+1:就是將arr隱式轉化為乙個(int*)型的指標, +1就是加該指標所指向的型別的大小(int大小為4個位元組)所以加4
&arr+1:就是將&arr隱式轉化為乙個int(*)型的陣列指標, +1就是加該指標所指向的型別的大小(int[10]大小為40個位元組)所以加40
首先我們來看下邊**
int
main()
;print_arr1
(arr,3,
5);print_arr2
(arr,3,
5);return0;
}void
print_arr2
(int
(*arr)[5
],int row,
int col)
void
print_arr2
(int arr[
5],int row,
int col)
arr是陣列首元素的位址,但是首元素是乙個陣列 int[5], 所以 arr的型別為 int ()[5] //陣列指標變數
所以傳參時我們可以用 int()[5]型別陣列指標變數來接收,但這不是常見的寫法,常見的寫法是
int arr[ ][5] 它會轉換成 int(*)[5],所以陣列arr[ ][5],第乙個[ ]裡邊寫幾或省略都可以,但是第二個[ ]中必須寫5。
陣列名和陣列名取位址
在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量 也就是陣列第乙個元素的位址。它的型別取決於陣列元素的型別 如果它們是int型別,那麼陣列名的型別就是 指向int的常量指標 在以下兩種場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符 的運算元時。siz...
陣列名和陣列名取位址
1 int a 10 2 int p a 3 int q 10 a 第二個為指向陣列的指標.a只是a 0 的位址,a 1就是a 1 的位址了,a是整個a 10 的首位址,是以整個陣列為角度來看,雖然它與a 0 的值相同,但是 a 1就已經增加了10個int型別的位元組的長度了.1 include 2...
陣列名和陣列名的取址
關於陣列名和指標的區別 推薦看這兩篇文章 示例 char a 3 輸出10進製位址 輸出 a 為 2686777 a 為 2686777 a是陣列名,編譯器處理時相當於陣列首元素的位址 a是乙個指向陣列的指標,值為陣列的位址,等於陣列首元素的位址 輸出 a 為 1 a 為 1 a 為 2686777...