int和char数组有什么区别?

时间:2011-11-25 16:40:29

标签: c++

下面的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数组是否显示不同的行为?

9 个答案:

答案 0 :(得分:9)

没有operator<<重载完全采用数组,因此您传递的参数(例如numbersletter)会经历数组到指针转换,分别为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

演示:http://ideone.com/O4T9N

答案 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)

编译器没有理由知道int[]数组的结束位置,但传统和标准库规定C字符串是空终止char[]数组。对于空终止的int[]数组,没有这样的传统或库支持。

如果您需要此功能,可以使用C ++ pretty打印机templates。我模糊地回忆起当类型实际知道绑定时使用数组的绑定,即由于你使用[]而不是[3],你的代码仍然无效。

只是fyi,您的代码无法通过将[]替换为STL中的[3]来修复,但可能operator<<可能会重载。