也许是一个愚蠢的问题。当我cout
指向char数组的指针时,我认为它会打印一个地址;相反,它取消引用地址并将实际值打印到null。
与int数组相反,它完成了我所期望的。它打印第一个元素的地址。
为什么在打印指针时会取消引用char元素。
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << as << endl;
int* s = new int[100];
s[0] = 2;
cout << s << endl;
问这个是因为当我尝试将地址放到第一个char元素a[0] = 'a';
时。我必须将它存储在指向指针的指针中。这对我来说似乎很奇怪,但除此之外。
char ** d = &as;
cout << d << "this is d" << endl;
答案 0 :(得分:2)
没有重载的输出运算符<<
打印任何char
指针的地址,它将所有char
指针视为字符串。如果要打印指针的地址,则需要将其转换为void*
std::cout << "Address of string is " << static_cast<void*>(as) << '\n';
在旁注,代码
char ** d = &as;
cout << d << "this is d" << endl;
将 不 打印字符串的地址,即as
中包含的指针,而不是打印变量 as
存储在内存中。不太一样。
答案 1 :(得分:2)
char*
字符指针被std::ostream
<<
运算符视为C样式的空终止字符串。你是对的,这是与其他指针类型不同的行为。
&a
不是指向a[0]
的指针。它是指向a
的指针,它本身就是一个指针。 a
实际上是指向a[0]
的指针,相当于&a[0]
。
答案 2 :(得分:1)
它打印字符串,因为该特定operator<<
重载的定义是什么。如果要打印地址,请转换为void *
:
cout << static_cast<void *>(as) << endl;
答案 3 :(得分:1)
IOStreams特别对待char*
(和const char*
),这样您就可以毫不费力地打印C字符串:
std::cout << "hello world\n";
(请记住,字符串文字表达式在传递给const char*
时会立即衰减到operator<<
。)
如果您不想要此行为,可以转换为void*
:
char* as = new char[100];
as[0] = 'a';
as[1] = 'b';
as[2] = NULL;
cout << (void*)as << endl;
您的“修复”实际上已损坏,因为您正在打印指针as
的地址,而不是as
指向的数组元素的地址。这由您已注意到的char**
类型表示。
答案 4 :(得分:0)
&lt;&lt;运算符重载以获取char*
并输出其内容,因为int*
/ int[]
没有此类重载。