在以下声明中,使用指针有何区别?

时间:2018-09-23 01:55:30

标签: c++ arrays pointers

char *array[size];
char (*aPointer)[size];

我对C ++很陌生,目前正在从事一项作业,我注意到有两种不同的(也许?)指针用法。 谁能告诉我他们有什么区别? 谢谢

2 个答案:

答案 0 :(得分:2)

char *array[size]声明了size个指向char的指针的数组。

char (*aPointer)[size]声明了一个指向size char s数组的指针。

仅出于完整性考虑,还有char *cPointer,它声明了指向char的指针,该指针可以是数组中的第一个指针。那和aPointer之间的区别是语义上的。内存布局将相同。例如,aPointer + 1将返回指向size所指向的位置后aPointer个字节的指针,而cPointer + 1将返回指向该位置的指针cPointer所指向的字节之后的一个字节。

因此char *array[size]声明如下:

 array      +--------+
+------+    | a char |
| a[0] +--->+--------+
+------+
| a[1] +--->+--------+
+------+    | a char |
| ...  |    +--------+
+------+

当然,所指向的每个char也可以是数组的第一个元素:

 array      +--------+--------+--------+
+------+    | a char | a char |  ...   |
| a[0] +--->+--------+--------+--------+
+------+
| a[1] +--->+--------+--------+--------+
+------+    | a char | a char |  ...   |
| ...  |    +--------+--------+--------+
+------+

char (*aPointer)[size]声明如下:

 aPointer
+--------+    +--------+
|        +--->+ a char |
+--------+    +--------+
              | a char |
              +--------+
              |  ...   |   aPointer + 1
              +--------+    +--------+
                        <---+        |
                            +--------+

char *cPointer可以这样声明:

 cPointer
+--------+    +--------+
|        +--->+ a char |   cPointer + 1
+--------+    +--------+    +--------+
              | a char +<---+        |
              +--------+    +--------+
              |  ...   |
              +--------+

请注意,在所有这些示例中,指针最初都没有指向任何东西。您必须自己将它们指向某处。

答案 1 :(得分:0)

第一个声明size指向char的指针的数组。第二个声明了一个指向size类型的char元素数组的指针。

您可以将其视为[]运算符比*更强大的绑定。开始在标识符处读取这样的声明,然后向外进行操作。在第一种情况下,我们看到标识符array。在它旁边,我们有[]*[]的绑定比*绑定更牢固,因此它首先适用。因此,array是一个东西数组。接下来应用*,因此array是一个指向某物的指针数组。剩下的唯一是类型说明符char,因此array是指向char的指针的数组。第二种情况类似地起作用,仅在这里有括号,迫使*[]之前应用。