我的代码打印出地址而不是数组值?

时间:2012-04-18 04:14:47

标签: c++

我的代码出了什么问题?我想打印出数组,但是当我尝试这样做时,似乎打印出一个地址。

#include <iostream>
#include <ctime>
#include <stdlib.h>

using namespace std;

int main ()
{
    srand(time(NULL));

    int array[9]= {0};

    for (int i=0;i<=8;i++)
    {
        array[i]= (rand()%101);
    }

    cout<< array;

    system ("PAUSE");
    return 0;
}

5 个答案:

答案 0 :(得分:4)

你不能只是cout一个数组。数组不是cout - 能够的。只要您成功cout T类型的某些内容,就意味着有一个专门设计的重载<<运算符,专门设计为cout类型T的值。对于<<数组(除了字符串),没有专用的cout运算符。因此,编译器为给定的参数类型选择最接近的匹配:指针的<<运算符。由于数组可以转换为指针,因此<<适用于此。

如果你想cout数组中所有元素的值,你必须手动cout逐个,或者使用一些可以为你做的标准算法。例如

std::copy(array, array + 9, std::ostream_iterator<int>(std::cout, " "));

答案 1 :(得分:2)

你需要做一个循环来自己输出每个数组元素。

问题是C ++并不总是知道数组的大小,所以它不能默认输出整个东西。

答案 2 :(得分:1)

您需要遍历数组并打印每个元素,就像在每个索引处分配值一样。由于数组衰减指向序列中第一个元素的指针,因此您将获得该地址。

答案 3 :(得分:0)

std::cout没有int array[9]的重载,所以这会衰减到指针(int*),这就是你所看到的显示(类似于0x7fffe47142d0)。

要单独打印数组中的int,您需要使用循环结构(如用于填充数组的for - 循环)并发送每个int 1}}依次为std::cout,可能还有一些空格来格式化它们。

一旦掌握了C ++及其标准库,您可能需要调查如何使用std::copy()进行此操作,但我怀疑这对您的作业来说有点先进。

答案 4 :(得分:0)

当值作为参数传递给函数时,C ++将数组类型衰减为指针类型。 C ++ 11有std::array(并且TR1指定std::tr1::array),它保留了数组的大小。以下是您使用std::array修改的示例:

#include <array>
#include <iostream>
#include <ctime>
#include <stdlib.h>

template<typename T, std::size_t N>
std::ostream& operator<< (std::ostream& ostm, const std::array<T, N>& a)
{
  for (auto const& x : a)
    ostm << x << ' ';

  return ostm;
}

int main ()

{
    srand(time(NULL));

    std::array<int, 9> array;
    for (auto& x : array)
        x = rand() % 101;

    std::cout<< array << std::endl;
}