我刚刚了解到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;
}
生成(需要图像,因为奇怪的字符不会复制):
在上面的程序中,我以为我会得到数组的起始地址,但我得到了这些有趣的角色。请评论我的编译器的这种行为。
答案 0 :(得分:3)
当我想做一些特别的事情时,这个功能不是一个绊脚石吗,比方说,使用一个char数组来保存非常小的int值?
是的,它可以。但是,只有当您想要打印地址或值并且没有意识到char
被区别对待时。您仍然可以通过将指针转换为void*
来打印地址,并且可以通过将其转换为更大的整数类型来打印该值。
但是当你做一些像char
数组作为空终止字符串这样的典型事情时,它会非常方便。
典型情况下的便利性在特殊情况下便于拍打。
答案 1 :(得分:1)
以NULL
结尾的字符数组通常被视为&#34;字符串&#34; (不要与std::string
混淆。)
您所看到的是控制台尝试打印基本上不可打印的字符,因为您尝试cout
不可打印的内容(积分值1,4,5等)。
十六进制值(0x7...
)是指向int
数组的内存位置的指针。这与与字符数组无关的功能有关。
如此
...这并没有不必要地阻止我使用char数组进行小注入...
和
...这不会不必要地阻止我使用char数组进行小整数?
嗯,这取决于。一般来说,没有它没有。如果您将有限范围的整数建模为char
s(例如字节数组),那么我想它可能。鉴于特殊用例,通常需要一些额外的工作(或使用适当的库)。