這是乙個很容易混淆的概念
int
*p1[5];
int(
*p2)[5
];
第乙個就是乙個指標陣列
[ ]的優先順序比*高,所以p1會先於[ ]結合,成為陣列,再和指標結合,成為陣列指標,也就是陣列中每乙個元素都是乙個指標
指標陣列是陣列,即-乙個陣列中,每個元素都是指標。
第二個就是乙個陣列指標
()的優先順序比[ ]高,所以*p先構成乙個指標,再和[ ]構成乙個陣列
所以p2是乙個指標,指向的是包含5個int 資料的陣列
陣列指標是指標,即乙個指向陣列的指標
下面舉乙個例子
int arr[5]
=;int(
*p1)[5
]=&arr;
/*下面是錯誤的*
/int
(*p2)[5
]= arr;
我們都知道,陣列名arr是陣列首元素的位址,而&arr是整個陣列的首位址
但是在c語言裡面,上面的是正確的,下面的確是錯誤的
在 c 語言中,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同,則需要顯示或隱式型別轉換。
在這裡面,p1和p2都是陣列指標,指向的是整個陣列
而&arr是整個陣列的首位址,也是指向的整個陣列
但是,arr卻是陣列首元素的位址,指向的是單個元素,資料型別不一樣,就會發生錯誤
下面我們來到二維陣列
我們定義了乙個二維陣列
#include
using namespace std;
int main(),
};cout<<
"a的值是:"
<
cout<<
"*a的值是:"
<<
*a<
cout<<
"*a[0]的值是:"
<
<
cout<<
"*a[0][0]的值是:"
<<
&a[0][
0]<
cout<<
"a[0][0]的值是:"
<
[0]<
return0;
}
下面是他的執行結果
我們可以看到 a ,*a ,*a[0] ,*a[0][0],這四個值是一樣的,那麼是不是就代表他們四個也相同呢?
當然不,他們的型別不同
a 是整個陣列的首位址,a[0] 是陣列第一行的首位址,雖然值相同,但是含義不同,也就是型別不同
a 是相對於整個陣列來說,a[0] 是相對於第一行來說
也就是,a是int *[3]型別
這裡就需要再次說明一下為什麼是int *[3]型別a[0]是int *型別p是乙個指標變數,它指向包含3個int元素的一維陣列,此時p的增量以它所指向的一維陣列長度為單位;
(p+i)是一維陣列a[i][0]的位址;
(p+2)+3表示a[2][3]位址(第一行為0行,第一列為0列),((p+2)+3)表示a[2][3]的值。
如果將a[0] 改為&a[0] , 那麼a和&a[0] 是相同的
下面我們再看乙個例子,這道題的正確答案是c a
定義了乙個二維陣列
看一下報錯資訊
提示型別轉換錯誤
pa應該定義為 (*pa)[5] ,[ ]裡面的數字應該是二維陣列每一行元素的個數 b
定義了乙個指標陣列
後半句也是錯誤的
左邊是乙個陣列,而右邊只是乙個元素的指標,型別不同
c是正確的
定義了乙個指標陣列,c陣列的每乙個元素已經是指標了,再取陣列名就又加了乙個指標,左邊也是指標的指標,型別相同
比如一維陣列dint s[2]=;
那麼s就是1的指標
也就是說,只取陣列名,就相當於加了乙個指標,如果陣列中的元素本來就是指標,那不就是指標的指標了麼
右邊是二級指標,左邊只是一級指標,所以錯誤
就是說如果你將乙個n級指標賦給指標變數,定義這個指標變數就得用n個*表示
一維陣列,二維陣列與指標
陣列與指標間的三條規則 陣列名是指向陣列首元素的指標。e相當於給e公升了一階。int a 4 a 0 本身是乙個值,a 0 是乙個位址,公升階大概就是這個意思 e相當於給e降了一階。降階相當於把乙個指標降為值,a 0 是乙個位址,a 0 就成為了值 以上內容來自北京大學 c程式設計高階 一維陣列與指...
指標與一維 二維陣列
示例程式 includevoid main int i,j 用陣列名做指標輸出資料 第一種方式 printf s n m 第二種方式 for i 0 m i 0 i printf c m i 注意點1 printf n 通過定義指標型變數輸出 char p m 將陣列首位址賦給指標變數p 第一種方式...
二維陣列 指標陣列與陣列指標
一 首先我們從字面意思理解一下什麼是指標陣列什麼是陣列指標 1 指標陣列 本質是乙個陣列,陣列中的每乙個元素是乙個指標。2 陣列指標 本質是乙個指標,而指標指向乙個陣列。二 我們該怎麼區分指標陣列和陣列指標?1 總共有三種表示形式 int p 4 和int p 4 和int p 4 表面看起來是不是...