2010-04-20 112 views
0
char *a[]={"diamonds","clubs","spades","hearts"}; 
char **p[]={a+3,a+2,a+1,a}; 
char ***ptr=p; 
cout<<*ptr[2][2]; 

为什么它显示H和请解释如何是PTR实施和它的元素数组指针

+1

@tushar:如果一个问题是功课,它是在堆栈溢出常见的做法是一门功课的标签添加到它。 – Tomalak 2010-04-20 18:16:31

+2

哇。我认为自己对C很好,并且我很难想象上面的代码。如果这是家庭作业,我不确定它有多好的作业问题。似乎只是测试对C的怪癖的深入了解。我可以想到更多有用的东西来教... – sblom 2010-04-20 18:26:46

回答

12

注意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' 
+0

我当然希望我们能看到谁做了编辑。我认为只有版主才能进行编辑而没有这样的痕迹。编辑对我来说很好,但匿名似乎并不冷...... – sblom 2010-04-20 18:31:24

+0

@sblom:不,它只是我在5分钟内删除了它。 – kennytm 2010-04-20 18:35:18

+0

啊,我明白了。凉。 – sblom 2010-04-20 18:37:23