【问题标题】:C++ Pass an array to a function and read its membersC++ 将数组传递给函数并读取其成员
【发布时间】:2019-01-04 12:42:36
【问题描述】:

在我的 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);
}

numbers 传递给定义为void logger(unsigned char data[])logger 会导致类型更改为unsigned char *,因此由于大小未知,因此无法遍历数组。

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

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

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

所以问题是;

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

【问题讨论】:

  • char c = 1;char c = '1';有区别
  • 将数组的长度作为第二个参数传递怎么样?
  • 这是使用std::arraystd::vector 代替的一个原因。或者,如果您必须 使用数组,则将大小作为参数传递。或者使用"size of array" template function
  • 顺便说一句,如果你有指向数组版本的指针,那么*(data[i]) 是不正确的。
  • 试试这个,std::cout &lt;&lt; +numbers[i] &lt;&lt; "\n";

标签: c++ arrays pointers


【解决方案1】:

问题在于你的数组的内容:

unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };

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

要获得代表1 的字符值,您需要编写一个字符文字'1'。如果您打算将它们存储并视为数字,则可以将数组的类型更改为int[8],或者在打印时强制转换:

std::cout << static_cast<int>(numbers[i]) << "\n";

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


要解决传递任意大小的数组的问题,可以使用模板并传递对std::array 的引用,或者直接使用vector

【讨论】:

  • 是的,我知道,但这是一个更大的项目的一部分,需要单字节数字并且没有其他类型可以使用
  • @Amir-Mousavi 我的回答也涉及这个问题。
【解决方案2】:

您不能将数组传递给 C++ 中的函数。有几种方法可以解决这个问题

1) 使用向量而不是数组

2) 传递对数组的引用(这只适用于固定大小的数组)

3) 传递指向数组第一个元素的指针(这要求您将大小作为单独的参数传递)。

这三个步骤都是这样的

1) 使用向量

#include <vector>

std::vector<unsigned char>{1,2,3,4,5,6,7,8}:
logger(numbers);

void logger(const vector<unsigned char>& data)
{
  for (auto i = 0; i < data.size(); i++)
  {
    std::cout << (unsigned)data[i] << "\n";
  }
}

2) 使用参考

unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers);

void logger(unsigned char (&data)[8])
{
  for (auto i = 0; i < 8; i++)
  {
    std::cout << (unsigned)data[i] << "\n";
  }
}

3) 使用指针

unsigned char numbers[8] = { 1,2,3,4,5,6,7,8 };
logger(numbers, 8);

void logger(unsigned char *data, size_t size)
{
  for (auto i = 0; i < size; i++)
  {
    std::cout << (unsigned)data[i] << "\n";
  }
}

向量是最好的解决方案。 C++ 有适当的数据结构作为标准,使用它们。

正如已经解释的那样,您的打印问题是由于打印字符的特殊规则造成的,只需在打印前强制转换为无符号即可。

没有代码经过测试(甚至编译)。

【讨论】:

    【解决方案3】:

    对于您的第一个问题,请使用:

     int arr_size = sizeof(numbers)/sizeof(numbers[0]);
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 2013-12-26
      • 2012-10-06
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多