看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
edash:所以說這個問題還未有真正答案出現??? 218.166.37.162 08/15