我看不懂 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
好的。让我们先讨论一些基本问题:
-
在许多系统中,
int
会比void *
占用更少的空间。所以你可能在打印指针的时候截断了它们。这很容易修复,所以让我们开始吧。 -
另外,没有必要强制转换
malloc()
的值,所以让我们把它去掉,让代码干净一点。 -
最后,正如chris所指出的,要使用
%p
格式说明符,我们需要将int **
和int *
变量强制转换为void *
。
#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]
指向什么。这是一个相当复杂的表达式,但我们可以使用一个相当简单的过程来简化它,最终得到*p
或p[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()
调用赋值。