“与一维数组类似,多维数组的名称是指向第一个数组元素的指针。”
#include <stdio.h>
int m[2][4];
int main() {
printf("%p\n", m); // 1
printf("%p\n", &(m[0])); // 2
printf("%p\n", m[0]); // 3
printf("%p\n", &m[0][0]); // 4
}
这会对所有语句输出相同的值。根据引用,1 == 2 和 3 == 4 是有道理的。但是我不理解 2 == 3 是怎么回事。m [0]
的地址怎么可能与 m [0]
相同呢?
int *p = malloc(n * sizeof(int))
才能够工作。尝试打印&m
,结果也会相同。因为对于数组来说,所有这些都没有被实际实现并且不占用内存,但仍然可以被使用并视为指向数组(或地址)的指针。 - infinite loop%p
仅适用于void
指针,因此代码应该像这样printf("%p\n", (void*) m);
。对于其他三个printf()
调用也是如此。否则将会引发未定义的行为。 - alkm
仍然是一个数组,而不是指针。 - chux - Reinstate Monica