C++将数组传递给函数并读取其成员

Ami*_*avi 2 c++ arrays pointers

在我的c ++程序中,我想将一个数组传递给一个函数,并将该数组的成员打印到控制台.

现在我遇到了两个问题:

int main()
{
    unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
    for (auto i = 0; i < sizeof(numbers); i++)
    {
        std::cout << numbers[i] << "\n"; // First Problem: Here i get 
    }
    logger(numbers);
}
Run Code Online (Sandbox Code Playgroud)

传递numberslogger定义为void logger(unsigned char data[])导致类型更改的原因unsigned char *所以没有办法迭代数组,因为大小是未知的.

我的目标也是传递任何大小的数组,但假设数组的大小始终为8,我将签名更改为

logger(&numbers)
void logger(unsigned char(*data)[8])
{
  for (auto i = 0; i < sizeof(*data); i++)
  {
    std::cout << *(data[i]) << "\n";
  }
}
Run Code Online (Sandbox Code Playgroud)

迭代data有第一个问题,输出是``

所以问题是;

  1. 为什么我会得到一个奇怪的ASCII字符cout.
  2. 我们应该如何处理将数组传递给另一个函数并迭代它,我搜索了很多但没有找到解决方案

Bar*_*icz 6

问题在于数组的内容:

unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
Run Code Online (Sandbox Code Playgroud)

那些被解释为字符代码(因为数组元素类型).,而不是文字值.很可能使用的字符映射是ASCII,而字符1到8是不可打印的.

要获得表示的字符值1,您需要编写一个字符文字'1'.如果您打算将它们存储并作为数字处理,您可以更改阵列的类型int[8],或者在打印时将其转换为:

std::cout << static_cast<int>(numbers[i]) << "\n";
Run Code Online (Sandbox Code Playgroud)

作为一方,如果您打算使用字符,则应将类型更改为char.


要解决传递任意大小的数组,要么使用模板并传递引用std::array,要么只使用a vector.