为什么打印字符串数组只打印第一个字符?
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<<
被重载以接受 char
和 char*
输入。在第一个重载中,它打印一个字符。在第二次重载中,它输出连续内存中的字符,直到到达空字符。
当你用赋值运算符声明一个 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*
导致接收单个字符。
下标运算符 []
的优先级高于间接运算符 *
.
所以branch[i]
returnsconst char *
和*branch[i]
returnsconst char
.
请解释两个程序输出的不同。
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<<
被重载以接受 char
和 char*
输入。在第一个重载中,它打印一个字符。在第二次重载中,它输出连续内存中的字符,直到到达空字符。
当你用赋值运算符声明一个 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*
导致接收单个字符。
下标运算符 []
的优先级高于间接运算符 *
.
所以branch[i]
returnsconst char *
和*branch[i]
returnsconst char
.