代码之家  ›  专栏  ›  技术社区  ›  JhSi

为什么打印字符串数组时只打印第一个字符?

  •  0
  • JhSi  · 技术社区  · 7 年前

    cout << branch[i] 在第一个程序中,输出为:

    Architecture
    Electrical
    Computer
    Civil
    

    cout << *branch[i]

    A
    E
    C
    C
    

    为什么?

    *branch[i] 只给出每个单词的第一个字符作为输出,并且 branch[i]

    方案1

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        const char *branch[4] = { "Architecture", "Electrical", "Computer", "Civil" };
    
        for (int i=0; i < 4; i++) 
            cout << branch[i] << endl;
    
        system("pause");
        return 0;
    }
    

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        const char *branch[4] = { "Architecture", "Electrical", "Computer", "Civil" };
    
        for (int i=0; i < 4; i++) 
            cout << *branch[i] << endl;
    
        system("pause");
        return 0;
    }
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Fureeish    7 年前

    当您申报 const char*

    const char* some_string = "some text inside";
    

    实际上,文本存储在特殊的只读内存中 在其后面添加了null终止字符( '\0' 常量字符* s、 每一个 在阵列点中 到内存中文本的第一个字符

    要了解接下来会发生什么,你需要了解 std::cout << 一起工作 常量字符* 是一个指针,它一次只能指向某个对象-指向文本的开头。什么 标准::cout<&书信电报; 直到遇到null终止字符为止 . 因此,如果您声明:

    const char* s = "text";
    std::cout << s;
    

    您的计算机将分配只读内存并分配要保存的字节 "text\0" 让你的 s 指向第一个字符(即 't' ).

    到目前为止还不错,但为什么打电话呢 std::cout << *s 只输出一个字符?那是因为你 解引用 指针,获取它指向的内容-单个字符。

    声明 const char* branch[4]; 您声明了 常量字符* s、 呼叫 branch[0] 替换为 *(branch + 0) 常量字符* . 那么,如果你这样做了 *branch[0] *(*(branch + 0)) ,即 常量字符* 导致接收单个字符。

        2
  •  1
  •   Remy Lebeau    7 年前

    branch[i] char* 指针,指向第一个 char

    *branch[i] 正在使用 operator* 取消引用该指针以首先访问该指针 烧焦

    operator<< 重载以同时接受两者 字符*

        3
  •  0
  •   boriaz50    7 年前

    这是因为 operators precedences

    下标运算符 [] 具有比间接运算符更高的优先级 * .

    所以 branch[i] 退货 const char * *branch[i] 退货 const char

        4
  •  -1
  •   gst1502    7 年前

    *branch[i] 打印单个 char branch[i] .

    分支机构[i] char* 以指向的地址开头的数组 分支机构[i] .