6

我完全理解什么是“ int *p[3]”(p 是一个由 3 个指针组成的数组,这意味着我们可以通过将内存分配为不同行的大小来拥有 3 个任意数量的 int 的不同行)。

我的困惑在于“ int (*p)[3]”这是什么意思?是像“p”存储3个int的连续内存的地址还是别的什么?

请澄清以及如何在程序中使用 use 来区分它们。

提前非常感谢。

@revised

很抱歉提出重复的问题。我没有仔细研究我的疑问。但我的疑问仍然是作为新手程序员。我浏览了 Q/A C 指针到数组/指针数组消歧的两个页面

整数 (*p) [4]?

第二个链接部分消除了疑问,因此消除了我的疑问,请参考堆栈和堆解释上述问题:例如

int *p[3]; // (1)

占用 12(3*4bytes) 字节的堆栈和堆将取决于运行时。现在为

int (*p1)[3]; //(2)

(2)使用“新”将是一个

p1 = new int[7][3]; // (3)

在链接int (*p) [4]的答案之一中给出?; 现在我的问题是因为“int (*p1)[3]; //(2)”是一个指向 3 个整数数组的指针,所以 p1 在编译时将占用多少内存,因为 eq(3) 也可以被替换为

p1 = new int[n][3]; // (3) where n is an integer

那怎么办?

请解释。

4

2 回答 2

16
int *p[3];  // type of p is int *[3]

声明p为数组 3 int *(即数组 3 int *

int (*p)[3];  // type of p is int (*)[3]

声明p为指向数组 3 的int指针(即指向数组 3 的指针int

于 2013-08-12T18:25:53.837 回答
3

声明的语法在 C 中有点繁琐,而 C++ 继承了相同的语法。特别是arrays和函数包装了声明。如果您牢记这一点,它可能会对您有所帮助:

int (*p)[3];
     *p      // p is a pointer to 
int (  )[3]  // an array of 3 int

您可以考虑将声明分为两行:

typedef int int3[3];
int3 *p;
于 2013-08-12T18:34:46.537 回答