C++ - 指针数组,为什么这样声明
C++ - Arrays of Pointers, why is it declared this way?
不知道如何措辞标题,但希望它有些准确。
我从一本书中找到了这段代码,我很困惑为什么它以这种方式声明(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 pointer
到 const char
的数组。
相关文章:
- 为什么在定义函数之前先声明它
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 为什么C++编译器没有检测到正确声明的类?
- 包含的类类型显然没有声明,为什么?
- 为什么我必须以这种方式声明指针?
- 为什么我们将单个或多维数组的大小声明为常量值?
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- 为什么即使我声明了朋友类,我也会收到错误"无法访问类中声明的私人成员"
- 为什么 C++ 中的以下结构声明会导致退出 127?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 我无法正确获取这些变量声明...为什么这些参数不起作用?我只是将 n 值设置为数组长度
- 默认参数声明:为什么默认字符串参数必须是 const
- 声明和带有定义的声明.为什么不允许这样做
- 类作为模板参数的前向声明.为什么会这样呢?
- 语法错误:需要声明.为什么gsoap不能读取vector