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

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


即使我分配一个字符串而不是指针地址也没有错误?
因为从我学到的知识来看,该指针只能由地址(&)或另一个指针(*)分配。更令人费解的是当我打印出指针数组时

cout<<suits[1];


我得到了字符串“ cab”,而不是地址,即使我没有使用取消引用运算符。当我使用解引用运算符时

cout<<*suits[1];


我只有'c'。

总结一下问题是:1)为什么我可以将字符串分配给char类型的指针而不是地址或指针,以及2)为什么当我打印出char类型的指针而不是给我地址时却显示字符串。 3)最后,为什么当我取消引用char类型指针时,它会给我字符串中第一个char的值。

真的想知道为什么char类型的指针与其他指针如此不同吗?

最佳答案

您似乎对C中的字符串感到困惑。

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

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

char abc_string[4] = {'a', 'b', 'c', '\0'};


(尽管实际上不会称为abc_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_string实际上是指&abc_string[0]-指向abc_string第一个元素的指针。

char *suits[] = {&abc_string[0], &cab_string[0], &bca_string[0]};


现在应该很清楚suits的元素指向什么-它们指向每个字符串的第一个字符。

这不是特定于数组的-如果您编写:

char *thing = "hello world";


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

关于c++ - 将字符串分配给指针数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28780307/

10-11 23:02
查看更多