请解释两个程序输出的差异。
第一个程序中的 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;
}
答案 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<<
已重载以接受char
和char*
输入。在第一次重载时,它会打印一个字符。在第二个重载中,它输出连续内存中的字符,直到它达到空字符。
答案 2 :(得分:0)
答案 3 :(得分:-1)
*branch[i]
打印位于char
指向的地址的单个branch[i]
。
branch[i]
打印整个char*
数组,以branch[i]
指向的地址开头。