我最近发布了几个与指针相关的问题。我试图团结我在这一篇文章中所遭受的困惑,所以如果它看起来很熟悉就道歉。问题是 - 为什么funky()
输出字符串而funkier()
输出地址?我的逻辑告诉我后者是我所期望的。或者这只是std::cout
处理事情的方式?
我注意到printf
的行为方式相同。
#include <iostream>
using namespace std;
void funky(const char* a);
void funkier(char* a[]);
int main() {
const char* y = "message";
funky(y);
char* z[3];
z[0] = "one";
z[1] = "two";
z[2] = "three";
funkier(z);
cin.get();
return 0;
}
void funky(const char* a) {
cout << a << endl; // prints the string.
}
void funkier(char* a[]) {
cout << a << endl; // prints the address.
}
答案 0 :(得分:5)
operator<<
的{{1}}因许多不同类型的右操作数而重载。
如果第二个操作数是std::ostream
,则它被解释为以NUL结尾的字符串并打印出来。
如果第二个操作数是const char*
,则将其打印为地址。
还有许多其他重载,但这些与此无关。
const void*
调用使用第一个重载。
但是funky()
参数实际上是funkier
,它不是上述参数。但它可以转换为char**
,而不是const void*
,因此会使用第二个重载。
小心const char*
!这是一个C函数,它不检测参数的类型。它希望您为每个参数传递正确的printf()
或%s
或其他内容。如果使用错误的字母或传递错误的参数类型,您可能会得到未定义的行为。
%p