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

Why printing the array of strings does print first characters only?

请解释两个程序输出的不同。

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;
}

计划 2

#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;
}

*branch[i] 打印位于 branch[i].

指向的地址的单个 char

branch[i]branch[i] 指向的地址开始打印整个 char* 数组。

branch[i] 包含一个 char* 指针,它指向空终止字符串的第一个 char

*branch[i] 正在使用 operator* 取消引用该指针以访问第一个 char

operator<< 被重载以接受 charchar* 输入。在第一个重载中,它打印一个字符。在第二次重载中,它输出连续内存中的字符,直到到达空字符。

当你用赋值运算符声明一个 const char* 时,例如:

const char* some_string = "some text inside";

实际发生的是将文本存储在特殊的只读存储器中 ,并在其后添加空终止字符 ('[=13=]')。当声明一个 const char* 数组时,它也会发生同样的情况。数组中的每个 const char* 都指向 内存中文本的第一个字符

要了解接下来会发生什么,您需要了解 std::cout << 如何与 const char* 一起使用。虽然 const char* 是一个指针,但它一次只能指向一个东西 - 指向文本的开头。 std::cout << 对它的作用是打印每个字符,包括提到的指针 指向的字符,直到遇到空终止字符 。因此,如果您声明:

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

您的计算机将分配只读内存并分配字节来保存 "text[=20=]" 并使您的 s 指向第一个字符(即 't')。

到目前为止一切顺利,但为什么调用 std::cout << *s 只输出一个字符?那是因为你 取消引用 指针,得到它指向的内容 - 单个字符。

我鼓励您阅读有关指针语义和取消引用指针的内容。这样你就很容易理解了。

如果您无法将刚刚在此处阅读的内容与您的示例联系起来:

声明 const char* branch[4]; 您声明了一个 const char* 数组。调用 branch[0]*(branch + 0) 取代,这是取消对数组的引用,这导致接收到单个 const char*。然后,如果你做 *branch[0] 它被理解为 *(*(branch + 0)),这是 取消引用 const char* 导致接收单个字符。

这是因为operators precedences.

下标运算符 [] 的优先级高于间接运算符 *.

所以branch[i]returnsconst char **branch[i]returnsconst char.