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

时间:2017-10-03 19:38:24

标签: c++ c-strings

请解释两个程序输出的差异。

第一个程序中的

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

4 个答案:

答案 0 :(得分:3)

当您使用赋值运算符声明const char*时,例如:

const char* some_string = "some text inside";

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

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

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

您的计算机将分配只读内存并分配字节以保留"text\0"并使s指向第一个字符('t')。

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

我鼓励您阅读指针语义和解除引用指针。你很容易理解这一点。

如果您无法将此处刚刚阅读的内容与您的示例相关联,那么

声明const char* branch[4];您声明了一个const char*的数组。调用branch[0]*(branch + 0)替换,这会使您的数组失效,从而导致收到一个const char*。然后,如果您执行*branch[0],则会将其理解为*(*(branch + 0))取消引用const char* ,从而获得单个字符。

答案 1 :(得分:1)

branch[i]包含一个char*指针,该指针指向以null结尾的字符串的第一个char

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

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

答案 2 :(得分:0)

这是因为operators precedences

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

所以branch[i]返回const char **branch[i]返回const char

答案 3 :(得分:-1)

*branch[i]打印位于char指向的地址的单个branch[i]

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