用于指向二维数组行的C指针声明
我在KN King第269页的书中看到了这个声明用于指向二维数组行的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 声
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