这是一个字符数组的声明
char my_string[] = "Hello";
等价于以下声明。
char my_string[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
这意味着数组的元素由字符串文字的字符初始化,包括其终止零。
在表达式中使用数组时,除了极少数情况外,它们会被转换为指向它们的第一个元素的指针。
例如,如果您正在使用sizeof运算符,则数组类型的对象不会转换为指向其第一个元素的指针。这是其中的一种罕见情况。
下面是一个演示程序:
int main()
{
int my_array[] = { 1, 2, 3 };
char my_string[] = "Hello";
std::cout << "sizeof( my_array ) = " << sizeof( my_array ) << '\n';
std::cout << "sizeof( my_string ) = " << sizeof( my_string ) << '\n';
return 0;
}
它的输出是:
sizeof( my_array ) = 12
sizeof( my_string ) = 6
例如,当数组类型的对象被用作运算符 * 的操作数时,它将被转换为指向其第一个元素的指针。
这里是另一个示例程序。
int main()
{
int my_array[] = { 1, 2, 3 };
char my_string[] = "Hello";
std::cout << "*my_array = " << *my_array << '\n';
std::cout << "*my_string = " << *my_string << '\n';
return 0;
}
该程序的输出为:
*my_array = 1
*my_string = H
在C++标准中定义了重载的
operator <<
,用于输出由指向char类型的指针指向的字符串(以零字符结尾的字符序列)。
因此,如果您编写
std::cout << my_string << '\n';
然后,在调用运算符<<时,字符数组会隐式转换为指向其第一个元素的指针,并输出指向的字符串。
对于整数数组,运算符<<的定义方式是仅输出该数组的地址,即其第一个元素的地址。
下面是一个演示程序。
#include <iostream>
int main()
{
int my_array[] = { 1, 2, 3 };
char my_string[] = "Hello";
std::cout << my_array << '\n';
std::cout << my_string << '\n';
return 0;
}
它的输出可能看起来像:
0x7ffdcfe094e4
Hello
如果您想让字符数组选择输出数组地址的重载运算符<<,则应将该数组(隐式转换为指向其第一个元素的指针)强制转换为类型
void *
。
这里是另一个演示程序。
#include <iostream>
int main()
{
int my_array[] = { 1, 2, 3 };
char my_string[] = "Hello";
std::cout << my_array << '\n';
std::cout << static_cast<void *>( my_string ) << '\n';
return 0;
}
它的输出可能是:
其输出可能为
0x7ffef7ac0104
0x7ffef7ac0112
char *my = mystring;
->char *my = my_string;
?“为什么字符数组返回字符串字面值”,你的意思是执行cout << mystring
会__打印__字符串吗? - KamilCuk