Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串指定给指针数组_C++_Arrays_String_Pointers - Fatal编程技术网

C++ 将字符串指定给指针数组

C++ 将字符串指定给指针数组,c++,arrays,string,pointers,C++,Arrays,String,Pointers,我可以知道为什么当我声明一个指针数组时 char *suits[]={"abc","cab","bca"} const char *suits[]={"abc","cab","bca"} 即使我给指针分配一个字符串而不是地址,也并没有错误? 因为据我所知,指针只能由地址(&)或另一个指针(*)分配。更令人费解的是当我打印出指针数组时 cout<<suits[1]; cUT> P>根据C++标准 4.2数组到指针的转换[conv.Array] 1“N T数组”或“未知数组”类

我可以知道为什么当我声明一个指针数组时

char *suits[]={"abc","cab","bca"}
const char *suits[]={"abc","cab","bca"}
即使我给指针分配一个字符串而不是地址,也并没有错误? 因为据我所知,指针只能由地址(&)或另一个指针(*)分配。更令人费解的是当我打印出指针数组时

cout<<suits[1]; 

<代码> cUT> P>根据C++标准

4.2数组到指针的转换[conv.Array]

1“N T数组”或“未知数组”类型的左值或右值 “T”的边界可以转换为“指向T的指针”类型的PR值最新版本 结果是指向数组第一个元素的指针。

在本声明中

char *suits[]={"abc","cab","bca"}
所有字符串文字都具有类型
const char[4]
,基于这些字符串文字的初始值设定项表达式将转换为指向字符串文字的第一个元素的指针。在C++中,它们有类型<代码> const char */COD>。因此,将数组声明为

char *suits[]={"abc","cab","bca"}
const char *suits[]={"abc","cab","bca"}

对于指向char
operator的指针,您似乎对C中的字符串感到困惑

字符串是字符数组,其中最后一个字符是
'\0'

如果您在源代码中的任何位置编写
“abc”
,编译器将为您创建一个数组,就像您声明了一个全局变量一样:

char abc_string[4] = {'a', 'b', 'c', '\0'};
(虽然它实际上不会被称为
abc\u string

“cab”和“bca”相同

那么,您的定义相当于:

char *suits[]={abc_string, cab_string, bca_string};
// where abc_string, cab_string and bca_string are the arrays created by the compiler.
现在,当您在C中使用数组名时,大多数情况下它会自动转换(它“衰减”)为指向其第一个元素的指针。因此,在上面的定义中,
abc\u string
实际上意味着
&abc\u string[0]
——指向
abc\u string
的第一个元素的指针

char *suits[] = {&abc_string[0], &cab_string[0], &bca_string[0]};
现在应该很清楚
的元素适合什么
指向-它们指向每个字符串的第一个字符

这不是特定于阵列的-如果您编写:

char *thing = "hello world";

然后编译器生成一个数组,其中包含
{'h','e','l','l','o','w','o','r','l','d','!','\0'}
,并将
东西设置为指向它的第一个元素。

这是一个完整的答案,无论何时使用它,都与其他数据类型不同“@Isseng Yes接线员@Vladfrommoskow非常感谢!!谢谢这对我理解它真的很有帮助!