C语言中两个指针相等时的指针算法

C语言中两个指针相等时的指针算法,c,C,请注意,我已经在stackoverflow中讨论了几个与指针相关的问题,但我无法得到我将要问的类似问题。这可能是问题已经存在,我不知道合适的标签搜索。这是我对C编程的怀疑 第一个节目 #include <stdio.h> #include <stdlib.h> int main(void) { int i,j; int **p = (int **)malloc(2 * sizeof(int *)); p[0]

请注意,我已经在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;
    }
输出为0


这两个程序看起来几乎相似,但结果不同。我只是无法理解下面发生了什么。任何人都可以帮忙。

p[1]=p[0]使
p[1]
(指针)指向与
p[0]
指向的内存相同的内存

p[1]=(int*)malloc(2*sizeof(int))
动态分配新内存,并让
p[1]
指向该内存


因此,如果您修改
p[1][i]
则在第一种情况下,您修改的对象与
p[0][i]
相同,但在第二种情况下,您修改的对象不是。在第一种情况下。在保存数据的位置分配了一个内存位置。在第二种情况下。内存分配两次,因此存在两个单独的内存位置,分别存放不同的数据。希望你能找出剩下的

长话短说。在第一种情况下。在保存数据的位置分配了一个内存位置。在第二种情况下。内存分配两次,因此存在两个单独的内存位置来保存数据。希望你能解决剩下的问题。这段代码中没有指针算法。算术意义
+
-
。指针算术含义
ptr+something
等@Lundin谢谢我更改了主题。因此,当循环第三次启动p[1][0]时,它实际上改变了p[0][0]的值,该值在第一次迭代时存储为0。@Lundin是的。它改变了
p[0][0]
p[1][0]
引用的对象。非常感谢。我忘了这不是数学运算,而是指针运算。实际上,它与指针运算没有任何关系。就跟一般的指针一样。“指针算术”是指指针值的加减运算,例如
p[1]
隐式执行(与
*(p+1)
相同)。它不是指整数值上的算术运算,因为它们是通过指针访问的。我实际上指的是等号。如果a=c,b=a,那么a=b=c,但第二种情况a=c,b=c,但a=b=在这两种情况下c是不同的。它有不同的地址。无论如何,谢谢你给我指明了正确的方向。
p[1] = (int *)malloc(2 * sizeof(int));