C++ - 指针数组,为什么这样声明

C++ - Arrays of Pointers, why is it declared this way?

本文关键字:声明 为什么 指针 数组 C++      更新时间:2023-10-16

不知道如何措辞标题,但希望它有些准确。

我从一本书中找到了这段代码,我很困惑为什么它以这种方式声明(C++是新手)以及它的实际含义,因为这本书没有很好地解释它并让我更加困惑:

const char * const suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};

我不明白 2 个 const 声明的使用以及字符串数组实际上是字符数组。那么,如果这些是 c 字符串,它们的长度不应该是 4 吗?或者因为它们是指针,这是否意味着它指向每个字符串的第一个字符?

只需要有人向我解释发生了什么,谢谢!

字符串数组实际上是一个字符数组。

其实不然。 suit是指向字符的指针数组。因此,您总共有 4 个指针,每个指针指向相应字符串的第一个字符。

也许一些ASCII艺术会有所帮助?

     +---+---+---+---+---+---+---+
     | H | e | a | r | t | s |NUL|
     +---+---+---+---+---+---+---+
       ^
       | +---+---+---+---+---+---+---+---+---+
       | | D | i | a | m | o | n | d | s |NUL|
       | +---+---+---+---+---+---+---+---+---+
       |   ^
       |   | +---+---+---+---+---+---+
       |   | | C | l | u | b | s |NUL|
       |   | +---+---+---+---+---+---+
       |   |   ^
       |   |   | +---+---+---+---+---+---+---+
       |   |   | | S | p | a | d | e | s |NUL|
       |   |   | +---+---+---+---+---+---+---+
       |   |   |   ^
     +-|-+-|-+-|-+-|-+
suit | * | * | * | * |
     +---+---+---+---+

我不明白使用 2 个常量声明

第一个const表示字符不会更改,第二个表示指针不会更改。

字符串文字是只读内存中的数组(意味着该数组中的char本质上是不可变的)。我们通常用指向其第一个字符的指针来表示 C 样式的字符串。对于文本,其中char s const ,此指针的类型为 const char*

如果你想要一个由 4 个不可变的 C 样式字符串组成的数组,你可以声明如下内容:

const char* arr[4];

此数组的每个元素都是一个指针,您可以指向 C 样式字符串中的第一个字符。如果您不需要更改数组中的指针本身,那么您也可以将指针声明为 const

const char* const arr[4];

所以需要明确的是,这里的 4 是我们所指向的 C 样式字符串的数量。在您的情况下,您在一副纸牌中为 4 种花色中的每一种都有一个字符串。

const char * const suit[4]

这表示suit是 4 const pointerconst char 的数组。