用于指向二维数组行的C指针声明

用于指向二维数组行的C指针声明,c,C,我在KN King第269页的书中看到了这个声明 int a[ROWS][COLS], (*p)[COLS]; p = &a[0]; p现在指向二维数组的第一行。我理解为什么[0]指向二维数组的第一行。但是我不理解声明p的语法。这是什么意思?我怎么记得 *p周围的人在做什么(*p)此语法在运算符优先级方面的含义是什么?忽略逗号并重新编写为: int a[ROWS][COLS]; int (*p)[COLS]; p = &a[0]; p是指向整数数组的指针COLSbig 声

我在KN King第269页的书中看到了这个声明

int a[ROWS][COLS], (*p)[COLS];

p = &a[0];
p
现在指向二维数组的第一行。我理解为什么[0]指向二维数组的第一行。但是我不理解声明
p
的语法。这是什么意思?我怎么记得


*p
周围的人在做什么
(*p)
此语法在运算符优先级方面的含义是什么?

忽略逗号并重新编写为:

int a[ROWS][COLS];
int (*p)[COLS];

p = &a[0];
p
是指向整数数组的指针
COLS
big 声明没有分配那么多内存,但是它允许一些边界检查。在声明中为数组分配了内存:
a
=>
inta[ROWS][COLS]

>“但我不理解声明p的语法”

因此
p
被声明为:

int (*p)[COLS];
它是指向
int
s数组的指针,其大小为
COLS

>“这是什么意思?我如何记住它?”

以下是如何判断,并从使用
()
开始:

当然,你总是可以:

>“此语法在运算符优先级方面意味着什么?”


在中,这意味着您需要
()
才能使
p
成为指向
int
s数组的指针,而不是指向
int
s的指针数组。

后缀
[]
()
运算符的优先级都高于一元
*
运算符,因此它们首先绑定。在这种情况下,
T*p[N]
被解释为
T*(p[N])
p
是指向
T
的指针数组。为了声明指向数组的指针(或指向函数的指针),必须使用括号强制
*
运算符在
[]
之前绑定:

T *p[N];     // p is an array of pointer to T
T (*p)[N];   // p is a pointer to an array of T

T *f();      // f is a function returning pointer to T
T (*f)();    // f is a pointer to a function returning T
我理解为什么[0]指向二维数组的第一行

这已经不准确了。在值上下文中,
a[0]
实际上并不指向“2D数组的第一行”
a[0]
实际上指向2D数组第一行的第一个元素。换句话说,在值上下文中,
a[0]
是指向
a[0][0]
的指针。
a[0]
的类型会衰减为
int*
,您可能知道。而
sizeof*a[0]
等于
sizeof(int)
。所以,它并没有真正指向整行。它指向一个单独的
int
对象

现在,如果确实要指向二维数组的第一行,即指向整行,则需要
&a[0]
。这将为您提供一个
int(*)[COLS]
类型的指针。请注意,
sizeof*&a[0]
等于
sizeof(int[COLS])
,因此它实际上是指向2D数组第一行的指针。这就是您在示例中看到的


请注意,数值上的
a[0]
&a[0]
(作为值上下文中的指针)是相同的,因为它们指向线性内存中的同一点。但是,键入明智的
&a[0]
指向整行,而
a[0]
指向单个元素

simple是指向int类型的
cols
元素数组的指针。将其取出并像*p(指针)一样进行分析,然后是数组声明
(*p)[
然后是每个元素类型
int
。数组大小为
cols
。现在,由于edit parn arount p保护它被声明为指向某个对象的指针,而不是int指针数组。括号是因为除此之外,
[]
*
之前绑定
int*p[COLS]
是指针数组,
int(*p)[COLS]
是指向数组的指针。这是我第一次看到这样声明的指针。那么,如果p增加1,它现在将指向第二行的第一个元素?@CarlNorum你能给我描述一下语法吗?或者请给我指一个参考吗?@CarlNorum谢谢!今天学到了新东西!=)这是一个指向数组的普通C指针。我想,看看初学者的书或教程吧?您可能会发现
cdecl
工具很有用。
T *p[N];     // p is an array of pointer to T
T (*p)[N];   // p is a pointer to an array of T

T *f();      // f is a function returning pointer to T
T (*f)();    // f is a pointer to a function returning T