下面的int和char数组有什么区别:
int main()
{
int numbers[] = {2,1,3};
char letter[] = {'a','b','\0'};
cout<< numbers<<endl;
cout<< letter<<endl;
}
输出:
0x22ff12 // an address
ab
为什么不显示213? 我知道数组的名称将指向其第一个元素的地址,但为什么 char数组是否显示不同的行为?
答案 0 :(得分:9)
没有operator<<
重载完全采用数组,因此您传递的参数(例如numbers
和letter
)会经历数组到指针转换,分别为void*
和char*
。
operator<<()
的重载需要const void*
,另一个需要const char*
。当你打电话:
cout<< numbers<<endl;
const void*
版本匹配,但是当您致电时:
cout<< letter<<endl;
匹配const char*
版本。
在const void*
版本中,显示指针,而使用const char*
版本时,字符串显示为空终止符。
答案 1 :(得分:8)
使用cout
打印数组时,它将打印数组的基址。
异常是使用已重载的char数组将其打印为c-string。
如果要打印int
数组的元素,则需要逐个元素地执行。
答案 2 :(得分:5)
原因是operator<<
重载了const char*
,它会打印每个字符,直到遇到\0
。
没有与int[N]
对应的重载,它会打印其中的每个元素。相反,当您编写cout << numbers
时,它会调用为operator<<
重载的void*
,并打印该地址。
但是,如果您为operator<<
重载T[N]
,那么您也可以将其打印出来。
这是一个简单的说明:
template<typename T, size_t N>
std::ostream & operator<<(std::ostream & out, const T (&a)[N])
{
for(size_t i = 0 ; i < N ; ++i)
out << a[i] << ' ';
return out;
}
int main()
{
int numbers[] = {2,1,3};
char letter[] = {'a','b','\0'};
cout<< numbers<<endl;
cout<< letter<<endl;
}
输出:
2 1 3
a b
答案 3 :(得分:4)
在C中,因此在C ++中,字符串通常由以0结尾的字符数组表示。因此,重载的运算符&lt;&lt;提供了std :: ostream类,其中std :: cout是一个实例,它将char *打印为字符串。没有这种常用的int数组,也没有任何约定,因此操作符'知道'要输出多少个元素,因此指向数组的指针与运算符的版本匹配&lt;&lt;通过打印其地址输出任何其他指针。
答案 4 :(得分:3)
char
数组是特殊的,因为运算符的重载&lt;&lt;将内容显示为字符串。
默认情况下,所有其他阵列都会显示地址。
答案 5 :(得分:1)
在C / C ++中,数组实际上是指向第一个元素的指针。指针保存存储值的地址。因此,如果您打印指针编号,您将获得第一个值(2)存储在内存中的地址。
char *是一个例外,因为当你尝试打印它时它会表现为字符串。
答案 6 :(得分:1)
你的代码主要是指C. char
的数组是C中字符串的事实表示。另一方面,C中的数组也是指向存储单元的指针(单元格的地址) )保存数组的第一个元素。
因此,当你打印出一个字符数组时,你实际上打印出一个字符串(因为C就是这样对待它)。当您打印一个整数数组时,您将打印出该数组的第一个元素的地址。
答案 7 :(得分:0)
数字是一个指针。 C ++中的所有数组实际上都是指针,数字[3]仅表示“存储器地址的值和数字+ 3”,因此您输出的是第一个元素的存储器地址。
答案 8 :(得分:0)