如何cout特殊处理char *有帮助吗?

时间:2015-11-10 09:10:07

标签: c++ pointers

我刚刚了解到cout在使用char指针时有一个“有用”的功能。因此,如果我们传递一个char指针,cout将继续打印,直到它遇到一个空字符。我的问题是,当我想要做一些特别的事情时,这个功能不是一个绊脚石,比方说,使用char数组来保存非常小的int值吗?

//pointers and strings
#include <iostream>
using namespace std;

int main() {
    char ch_arr [] = "Can you print this?";
    char *ptr_chr = ch_arr;
    char char_as_int[] = {1, 4, 5};
    int int_arr [] = {1, 2, 3};

    cout << ch_arr << endl;
    cout << ptr_chr << endl;
    cout << int_arr << endl;
    cout << char_as_int << endl;
    return 0;
}

生成(需要图像,因为奇怪的字符不会复制):

Helpful cout?

在上面的程序中,我以为我会得到数组的起始地址,但我得到了这些有趣的角色。请评论我的编译器的这种行为。

2 个答案:

答案 0 :(得分:3)

  当我想做一些特别的事情时,

这个功能不是一个绊脚石吗,比方说,使用一个char数组来保存非常小的int值?

是的,它可以。但是,只有当您想要打印地址或值并且没有意识到char被区别对待时。您仍然可以通过将指针转换为void*来打印地址,并且可以通过将其转换为更大的整数类型来打印该值。

但是当你做一些像char数组作为空终止字符串这样的典型事情时,它会非常方便。

典型情况下的便利性在特殊情况下便于拍打。

答案 1 :(得分:1)

NULL结尾的字符数组通常被视为&#34;字符串&#34; (不要与std::string混淆。)

您所看到的是控制台尝试打印基本上不可打印的字符,因为您尝试cout不可打印的内容(积分值1,4,5等)。

十六进制值(0x7...)是指向int数组的内存位置的指针。这与与字符数组无关的功能有关。

如此

  

...这并没有不必要地阻止我使用char数组进行小注入...

  

...这不会不必要地阻止我使用char数组进行小整数?

嗯,这取决于。一般来说,没有它没有。如果您将有限范围的整数建模为char s(例如字节数组),那么我想它可能。鉴于特殊用例,通常需要一些额外的工作(或使用适当的库)。