二维数组中指向整行的指针

3
假设我声明一个二维数组为:
int a[10][10];

根据我的理解,a是一个int类型的双指针。
假设我按照以下方式声明指向整个行的指针。
int (*p)[10];

“也就是说,a [0] 指向第 0 行,a [1] 指向第 1 行,依此类推。

因此,我尝试将 p 初始化为


p = a[0];  /* so that p can point to row 0 */

我收到了一个编译器警告,指出指针赋值不兼容。但是如果我写成:
p = a;

这很好运作。 有人能告诉我我在这里做错了什么吗?

2
据我理解,a是int类型的双重指针 - 不,它是一个数组的数组。它不是指针。它不是“双重指针”。它不是指向指针的指针。它是一个数组(由数组组成)。因此,p[0]p[1]以及p[i](对于所有0 <= i < 10)也不是指针。它们也是数组。它们会衰变成类型为int *的指针。类型int *与类型int (*p)[10]不兼容。但是,你是正确的,数组的第i行的指针int (*)[10]类型的。所以你可以这样写:int (*row)[10] = &a[0]; - The Paramagnetic Croissant
可能是C指向数组/指针数组的歧义的重复问题。 - The Paramagnetic Croissant
根据我的理解,a是int类型的双指针。这是一个非常普遍且持久的误解。你必须学会区分数组和指针的差异,而不要被语法上可以互换符号的能力所迷惑。 - dmckee --- ex-moderator kitten
不是重复的内容... 我关心的不仅仅是语法。 - Sumit Trehan
4个回答

5
据我理解,a是一个int类型的双指针。
你错了。a是一个由int数组组成的数组。除非它是sizeof和一元&的操作数,否则数组名会转换为指向其第一个元素的指针。 a[0]指向行0a[1]指向行1,以此类推,这也是错误的。在衰减后,a[0]指向第一行的第一个元素,a[1]指向第二行的第一个元素。&a[0]将给出行0的地址。
p = &a[0];  // Equivalent to p = a 

1

a不是一个双重指针。它是由十个包含十个整数的数组组成的数组。在大多数情况下,它会“衰变”为类型为int (*)[10]的指针,即指向第一行的指针。

因此,在p = a赋值中,a按上述方式衰变,因此p指向第一行。

如果要指向另一行,则需要显式地取其地址:

p = &a[5]

1

a是int类型的双重指针。

不对。 a 是一个由 int 数组构成的数组。

a[0]也指向第0行

不对。 a[0] 是第一行,是一个 int 数组。如果要指向第一行,需要使用 &a[0]

大多数情况下,你可以将 &a[0] 简写为 a,因为在大多数(但不是所有)情况下,数组表达式会被隐式转换为指向其第一个元素的指针。


另一种思考 &a[0] 的方式是它实际上等同于 &(*(a+0)),这与 &*a 相同,并且(由于相邻的 &* 运算符被隐式缩减)等同于 a - Grzegorz Szpetkowski

0

您可以通过使用名称来分配指向数组、字符串或函数的指针。例如,如果a [10]是由10个整数元素组成的数组,则可以使用表达式p = a来分配指针p,现在'a'将给出数组的基地址。因此,'p'现在指向一个由10个元素组成的数组。

同样的概念也适用于字符串和函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接