我可以知道为什么当我声明一个指针数组时
char *suits[]={"abc","cab","bca"}
即使我将一个字符串而不是地址分配给指针,也没有错误吗? 因为据我了解,指针只能由地址(&)或另一个指针(*)赋值。更令人费解的部分是当我打印出指针数组时
cout<<suits[1];
即使我不使用取消引用运算符,我也得到了字符串“cab”,而不是地址。当我使用取消引用运算符时
cout<<*suits[1];
我只有'c'。
总结一下问题是 1) 为什么我可以将字符串分配给 char 类型指针而不是地址或指针,以及 2) 为什么当我打印出 char 类型指针而不是给我地址时,它显示出字符串。 3)最后,为什么当我取消引用 char 类型指针时,它会给我字符串中第一个 char 的值。
真的很想知道为什么 char 类型指针与其他指针如此不同?
最佳答案
根据C++标准
4.2 Array-to-pointer conversion [conv.array]
1 An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The result is a pointer to the first element of the array.
在这个声明中
char *suits[]={"abc","cab","bca"}
所有字符串文字的类型都是 const char[4]
基于这些字符串文字的初始化表达式被转换为指向字符串文字第一个元素的指针。在 C++ 中,它们的类型为 const char *
.因此,像这样声明数组会更正确
const char *suits[]={"abc","cab","bca"}
指向 char operator <<
的指针被显式重载并执行指针指向的输出字符,直到遇到零终止字符。也就是说,如果您在运算符 << 中使用指向 char 的指针,那么您将输出该指针指向的字符串。
至于这条记录
cout<<*suits[1];
那么根据 suits 的定义,作为一个指针数组,suits[1] 是数组的第二个元素,它是指向字符串文字“cab”的第一个元素的指针。因此取消引用指针,您将获得字符串文字的第一个元素,即字符“c”。
关于c++ - 将字符串分配给指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28780307/