【问题标题】:Assign string to the pointer array将字符串分配给指针数组
【发布时间】:2015-02-28 09:44:15
【问题描述】:

我可以知道为什么当我声明像这样的指针数组时

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

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

cout<<suits[1]; 

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

cout<<*suits[1];

我只有“c”。

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

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

【问题讨论】:

    标签: c++ arrays string pointers


    【解决方案1】:

    根据 C++ 标准

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

    1 类型为“N T 数组”或“未知数组”的左值或右值 T 的边界”可以转换为“指向 T 的指针”类型的纯右值。 该 result 是指向数组第一个元素的指针。

    在此声明中

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

    所有字符串文字都具有const char[4] 类型,并且基于这些字符串文字的初始化表达式被转换为指向字符串文字第一个元素的指针。在 C++ 中,它们的类型为 const char *。因此,像这样声明数组会更正确

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

    对于指向 char operator &lt;&lt; 的指针被显式重载并执行指针指向的输出字符,直到遇到零终止字符。也就是说,如果您在运算符

    至于这条记录

    cout

    那么根据 suits 作为指针数组的定义,suits[1] 是数组的第二个元素,它是指向字符串字面量“cab”的第一个元素的指针。因此,取消引用指针,您将获得字符串文字的第一个元素,即字符 'c'。

    【讨论】:

    • 这是一个完整的答案
    • 所以与其他数据类型不同,每当我使用“
    • @Iseng 是的,运算符
    • @VladfromMoscow 非常感谢!!
    【解决方案2】:

    您似乎对 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实际上是指&amp;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 设置为指向它的第一个元素。

    【讨论】:

    • 谢谢!!这对我理解真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多