char *a[]={"diamonds","clubs","spades","hearts"};
char **p[]={a+3,a+2,a+1,a};
char ***ptr=p;
cout<<*ptr[2][2];
爲什麼它顯示H和請解釋如何是PTR實施和它的元素數組指針
char *a[]={"diamonds","clubs","spades","hearts"};
char **p[]={a+3,a+2,a+1,a};
char ***ptr=p;
cout<<*ptr[2][2];
爲什麼它顯示H和請解釋如何是PTR實施和它的元素數組指針
注意x[y]
結合不同於*x
更緊的2D陣列,所以表達式*ptr[2][2]
被解釋爲*(ptr[2][2])
的。
另請注意x[y] == *(x+y)
。
因此
*(ptr[2][2]) == *(p[2][2]) // ptr = p
== *((a+1)[2]) // p[2] == a+1
== *(*(a+1+2)) // x[y] == *(x+y)
== *(*(a+3)) // 1+2 == 3
== *(a[3]) // *(x+y) == x[y]
== *("hearts") // a[3] == "hearts"
== "hearts"[0] // *x == *(x+0) == x[0]
== 'h'
見KennyTM的一個解釋優良的答案...但我認爲這將是一個自稱使用調試器,以「可視化」記憶的完美情況..並提供一個簡單的答案到這種類型的問題。
alt text http://img717.imageshack.us/img717/5536/callstack.png
@tushar:如果一個問題是功課,它是在堆棧溢出常見的做法是一門功課的標籤添加到它。 – Tomalak 2010-04-20 18:16:31
哇。我認爲自己對C很好,並且我很難想象上面的代碼。如果這是家庭作業,我不確定它有多好的作業問題。似乎只是測試對C的怪癖的深入瞭解。我可以想到更多有用的東西來教... – sblom 2010-04-20 18:26:46