【发布时间】:2017-09-05 04:30:07
【问题描述】:
C Programming in One Hour a Day 有这样一句话:
与一维数组一样,多维数组的名称是指向第一个数组元素的指针。
#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,结果也会相同。因为对于数组的情况,所有这些都没有实际实现,不占用内存,但仍然可以作为指向数组(或地址)的指针使用和考虑 -
OT:转换说明符
%p仅针对void指针定义,因此代码应类似于printf("%p\n", (void*) m);。对printf()的其他三个调用也是如此。调用其他未定义的行为。 -
亲爱的主,这个问题已经问了多少种方式了?
-
"与一维数组一样,多维数组的名称是指向第一个数组元素的指针。" --> 不。数组不是指针。在选择情况下,数组转换为第一个元素的指针,但
m仍然是数组。
标签: c arrays multidimensional-array