Re: [問題] 關於二維陣列
看板C_and_CPP (C/C++)作者khoguan (Khoguan Phuann)時間19年前 (2005/08/15 05:44)推噓1(1推 0噓 0→)留言1則, 1人參與討論串1/3 (看更多)
※ 引述《LPH66 (運命のルーレット廻して)》之銘言:
: ※ 引述《edash (團長)》之銘言:
: : 這是我的程式碼:
: : #include<iostream>
: : using namespace std;
: : int main(){
: : int a[3][4];
: : cout << *(a[1]) <<" "<< a[1][0] <<endl;
: : cout << a+1 <<" "<< a[1] <<endl;
: : cout << *(a+1) <<" "<< a[1][0] <<endl;
: : system("PAUSE");
: : }
: : 以下是輸出:
: : 2009109320 2009109320
: : 0x22ff50 0x22ff50
: : 0x22ff50 2009109320
: : 請按任意鍵繼續 . . .
: : ----------------
: : 可以看到 a+1 和 *(a+1) 長的一樣,這是我所不懂的
: : 還有 a+1 和 a[1] 長的一樣,但 *(a+1) 卻和 *(a[1]) 不同
: : 我想這些大概就是我不了解的地方了
: a是一個int ** 所以a+1也是int **
將 a 解釋為 int** 固然可以順利的解釋原po的問題。
但是嚴格來說,並不是這樣,像是:
int foo(int** arr)
{
return arr[1][2];
}
int main()
{
int arr[2][3] = { {0,1,2}, {3,4,5} };
foo(arr);
return 0;
}
在 C++ 是編譯不過的。C 也會警告指標的型別不相容。
arr 本身的型別是 int[2][3],在許多情形下使用到 arr 時,
arr 會 decay 成為 int (*)[3],但 int (*)[3] 並不會進一步
又 decay 成為 int**
: 故*(a+1)是一個int *
: 對cout來說 它們兩個都是指標 自然用指標的方式輸出 所以這表示它們指的位址相同
: 而*(a+1)表示a[1] 那是二維陣列第二行的開頭指標
: a+1表示&a[1] 表示a[1]所在的位置 而第二行的開頭指標自然就是a[1]的位置
: 所以兩個位址是相同的 但是它們表示不同的東西
: 又 *(a[1]) 相當於*(a[1]+0) 也就是a[1][0] 自然和*(a+1)不一樣了
: *(a[1]) 是一個int 表示a[1]指到的地方的值 就是a[1][0]的值
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.168
推
218.166.37.162 08/15, , 1F
218.166.37.162 08/15, 1F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
-4
30