2014-02-11 50 views
-2

我似乎无法理解为什么这个代码打印1作为答案。 我正在学习C语言,这是作业的一个问题。 有人可以解释一下吗?我不明白这个代码片段在C

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    int i,j; 
    int **p = (int **)malloc(2 * sizeof(int *)); 
    p[0] = (int *)malloc(2 * sizeof(int)); 
    p[1] = p[0]; 
    for(i = 0; i < 2; i++) 
      for(j = 0; j < 2; j++) 
        p[i][j] = i + j; 
    printf("%d",p[0][0]); 
    return 0; 
} 

在我看来应该打印0,但它似乎我错了。

+2

*它会返回什么? –

+8

请注意,'p [0]'和'p [1] [0]'是同一个对象,因为'p [1]'指向与p [0]相同的地址。 –

+0

它返回值1. – cstoica

回答

2

你对这些指针感到困惑。 p[0]是指向int的指针,因此是p[1]

该代码使得p[0]p[1]指向相同的地址:

p[1] = p[0]; 

这具有p[i][j]是指相同的对象i是否是0或1。嵌套的循环将在第一访问p[0][0]效果的地方,将其设置为0,但后来p[1][0](其在相同的对象p[0][0]被访问,从而导致它在此处指定1.

的关键点是,p[0][0]p[1][0]是一样的。

+0

非常感谢,现在一切都很清楚 – cstoica

0

p[0]p[1]都是int *类型(即指针)。

p[1] = p[0]; 

两个p[1]p[0]后都指向同一个地址,这使得p[0][0]同样以p[1][0]。该值由它最后一次更新决定。而p[1][0]更新该值在最后,这使得最终的结果是1

如果你改变你的代码:

for(i = 1; i >= 0; i--) 
    for(j = 1; j >= 0; j--) 
     p[i][j] = i + j; 
printf("%d",p[1][0]); 

你猜怎么着,它会打印0。希望它帮助。

+0

谢谢,我现在明白 – cstoica