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