请注意,我在stackoverflow中经历了几个与指针算术有关的问题,但是我无法得到类似的问题。可能是该问题已经存在,我不知道要搜索的适当标签。这是我对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;
}
输出为1
第二程序
第7行更改为
p[1] = (int *)malloc(2 * sizeof(int));
输出为0;
这两个程序看起来都差不多,但是它们给出的结果不同。我只是无法理解该算法。谁能帮忙。
p[1] = p[0];
使p[1]
(它是一个指针)指向same存储器,就像p[0]
指向。
[p[1] = (int *)malloc(2 * sizeof(int));
]动态分配new内存,并让p[1]
指向该内存。
因此,如果您修改p[1][i]
,则在第一种情况下修改的是与p[0][i]
相同的对象,但在第二种情况下没有。
长话短说。在第一种情况下。在分配的单个存储位置中保存了数据。在第二种情况下。内存分配了两次,因此存在2个单独的内存位置,用于保存单独的数据。希望你能解决剩下的问题