我能';我不理解C语言中的这段代码

我能';我不理解C语言中的这段代码,c,code-snippets,C,Code Snippets,我似乎不明白为什么要打印代码1作为答案。 我正在学习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

我似乎不明白为什么要打印代码1作为答案。 我正在学习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;
}
#包括
#包括
内部主(空){
int i,j;
int**p=(int**)malloc(2*sizeof(int*);
p[0]=(int*)malloc(2*sizeof(int));
p[1]=p[0];
对于(i=0;i<2;i++)
对于(j=0;j<2;j++)
p[i][j]=i+j;
printf(“%d”,p[0][0]);
返回0;
}

我认为应该打印0,但似乎我错了。

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

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。希望有帮助。

您对指针感到困惑
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]
是相同的。

它返回什么?注意
p[0][0]
p[1][0]
是同一个对象,因为
p[1]
指向与
p[0]
相同的地址。它返回值1。我想到了,但我能理解p[1]指向p[1][0]但是为什么p[0]取p[1]的值,如果代码是p[0]=p[1],那么应该是这样的。我错了吗?我是说打印,很抱歉
p[1] = p[0];