无法理解C中双指针的值

时间:2014-08-21 19:41:37

标签: c pointers malloc multidimensional-array

我无法理解 first and second value of the output ,为什么它们不同?这里的第二个输出是什么意思? 守则是:

int **p = (int **)malloc(sizeof(int *) * 2);
int i, j, c = 1;

for (i = 0; i < 2; i++) {
    p[i] = (int *)malloc(sizeof(int) * 2);
}

for (i = 0; i < 2; i++) {
    for (j = 0; j < 2; j++) {
        p[i][j] = c++;
    }
}

printf("%d %d %d %d\n", (int)&p[0][0], (int)p, (int)*p, **p);

输出:34439216 34439184 34439216 1

1 个答案:

答案 0 :(得分:1)

好的。我们先谈谈一些基本问题:

  1. 在许多系统上,int占用的空间比void *少。{1}}。因此,当您打印它们时,您可能会截断指针。这很容易解决,所以让我们这样做。

  2. 此外,没有必要强制转换malloc()的值,所以让我们去除它以及稍微清理一下代码。

    < / LI>
  3. 最后,正如克里斯所说,要使用%p格式说明符,我们需要将int **int *变量转换为void *

  4. 修正了foo.c

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

    现在输出:

    0x7fd193c03930 0x7fd193c03920 0x7fd193c03930 1
    

    现在,您的实际问题是:

    首先,让我们谈谈&p[0][0]指向的地址。这是一个相当复杂的表达方式,但我们可以使用相当简单的流程来减少它,以便最终得到*pp[0]

    &p[0][0] == &*(p[0] + 0) == p[0] + 0 == p[0] == *(p + 0) == *p
    

    考虑到这一点,应该很清楚为什么&p[0][0](第一个参数)和*p(第三个参数)打印相同的值。

    现在,我没有看到p[0]指向与p相同的地址的任何充分理由。已为p的单独调用分配了p[0]malloc()的值。