为什么要打印内存地址而不是c +。+中的数组值

时间:2018-03-20 22:07:18

标签: c++ arrays

当我尝试打印数组的值时,会打印其内存位置而不是值。我做错了什么?

int main()
{
    int list[3];
    for (int i=0; i<3; i++)
    {   
        list[i] = i;
        std::cout<<list<<std::endl;
    }   
}

输出:0x7ffffef79550

4 个答案:

答案 0 :(得分:3)

使用iostream库时,C ++不会为数组提供重载。如果要打印数组的值,则需要编写函数或找到其他人编写的函数。

幕后发生的事情是list正在衰减到int*,这就是你所看到的印刷品。

答案 1 :(得分:2)

这看起来像是一个印刷错误:

std::cout << list

你想要打印数组的特定元素,对吗?

std::cout << list[i]

打印&#34;整个阵列&#34;如果没有索引,则会打印指向第一个元素的指针(原因请参见其他答案)。

答案 2 :(得分:1)

std::cout << list << std::endl;

您正在打印数组对象本身。你期待看到什么?数组标识符的名称?数组中第一个元素的地址? (实际上这就是你的情况)。或者你期望数组整齐地迭代它的元素并构建一个逗号分隔的所有值的字符串并将其输出到流?如果这是你想要的,你必须自己实现它。

template <std::size_t N>
std::ostream& operator<<(std::ostream& out, int (&arr)[N]) {
    std::copy(std::begin(arr), std::end(arr), std::ostream_iterator<int>{out, ", "});
    return out;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    std::cout << arr << std::endl; // Ok, prints "1, 2, 3, 4, 5, ".
}

答案 3 :(得分:-1)

你不能一次打印整个数组(列表,类等)就像你在python中做的那样(尽管还有方法可以做到这一点)但是这里发生的是C ++中的数组实际上是指向类型的指针(在你的案例中int)并打印list你实际上正在尝试打印指针的内存地址,从而得到你得到的输出。