很难理解C语言中的双指针的值



我看不懂 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 %dn", (int)&p[0][0], (int)p, (int)*p, **p);

输出:34439216 34439184 34439216 1

好的。让我们先讨论一些基本问题:

  1. 在许多系统中,int会比void *占用更少的空间。所以你可能在打印指针的时候截断了它们。这很容易修复,所以让我们开始吧。

  2. 另外,没有必要强制转换malloc()的值,所以让我们把它去掉,让代码干净一点。

  3. 最后,正如chris所指出的,要使用%p格式说明符,我们需要将int **int *变量强制转换为void *

固定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 %dn", (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相同的地址。pp[0]分别被malloc()调用赋值。

相关内容

  • 没有找到相关文章

最新更新