基本指针问题

时间:2014-08-14 21:01:47

标签: c++ pointers

我最近发布了几个与指针相关的问题。我试图团结我在这一篇文章中所遭受的困惑,所以如果它看起来很熟悉就道歉。问题是 - 为什么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.
}

1 个答案:

答案 0 :(得分:5)

operator<<的{​​{1}}因许多不同类型的右操作数而重载。

如果第二个操作数是std::ostream,则它被解释为以NUL结尾的字符串并打印出来。

如果第二个操作数是const char*,则将其打印为地址。

还有许多其他重载,但这些与此无关。

const void*调用使用第一个重载。

但是funky()参数实际上是funkier,它不是上述参数。但它可以转换为char**,而不是const void*,因此会使用第二个重载。

小心const char*!这是一个C函数,它不检测参数的类型。它希望您为每个参数传递正确的printf()%s或其他内容。如果使用错误的字母或传递错误的参数类型,您可能会得到未定义的行为

%p