gpt4 book ai didi

c - 难以理解 C 中双指针的值

转载 作者:行者123 更新时间:2023-11-30 21:25:55 25 4
gpt4 key购买 nike

我无法理解输出的第一个值和第二个值,为什么它们不同?这里的第二个输出是什么意思?代码是:

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. 在许多系统上,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 %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 相同的地址的任何充分理由。 pp[0] 已通过对 malloc() 的单独调用分配了值。

关于c - 难以理解 C 中双指针的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25434631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com