我可以知道为什么当我声明一个指针数组时
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/