我似乎无法理解为什么这个代码打印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;
}
在我看来应该打印0,但似乎我错了。
答案 0 :(得分: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]
是相同的。
答案 1 :(得分: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.希望它有所帮助。