我完全理解什么是“int *p[3]
”(p是一个3指针数组,意味着我们可以通过将内存分配为不同行的大小来拥有3个不同行数的3行)。
我的困惑在于“int (*p)[3]
”这意味着什么?它是否像“p”存储int或其他内容的3个连续内存的地址?
请澄清以及如何在程序中使用它们来区分它们。
提前多多感谢。
@revised
很抱歉提出重复的问题。我并没有深刻地质疑我的疑问。但我怀疑仍然是新手程序员。我浏览了Q / A C pointer to array/array of pointers disambiguation
的两个页面和
第二个链接部分清除了疑问所以消除我的疑问请在参考堆栈和堆时解释上面的问题: 例如
int *p[3]; // (1)
占用12个(3 * 4bytes)字节的堆栈,而堆取决于运行时。 现在为
int (*p1)[3]; //(2)
(2)使用“new”将是一个
p1 = new int[7][3]; // (3)
在链接int (*p) [4]?的答案之一中给出;现在我的问题是因为“int(* p1)[3]; //(2)”是一个指向3个int数组的指针,因此在编译时p1将占用多少内存,因为eq(3)也可以
取代 p1 = new int[n][3]; // (3) where n is an integer
那么呢?
请解释。
答案 0 :(得分:15)
int *p[3]; // type of p is int *[3]
将p
声明为int *
的数组3(即三个数组int *
)
和
int (*p)[3]; // type of p is int (*)[3]
将p
声明为指向int
数组3的指针(即指向三个int
数组的指针)
答案 1 :(得分:3)
声明的语法在C中有点麻烦,并且C ++继承了相同的语法。特别是arrays
和函数 wrap 声明。如果你牢记这一点,它可能对你有帮助:
int (*p)[3];
*p // p is a pointer to
int ( )[3] // an array of 3 int
您可以考虑将声明分为两行:
typedef int int3[3];
int3 *p;