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

时间:2019-01-04 12:42:36

标签: 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);
}

numbers传递到定义为logger的{​​{1}}导致类型更改为void logger(unsigned char data[]),因此由于大小未知,因此无法遍历数组。< / p>

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

unsigned char *

logger(&numbers) void logger(unsigned char(*data)[8]) { for (auto i = 0; i < sizeof(*data); i++) { std::cout << *(data[i]) << "\n"; } } 上迭代是第一个问题,输出为``

所以问题是;

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

4 个答案:

答案 0 :(得分:6)

问题出在数组的内容中

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

答案 1 :(得分:3)

您不能将数组传递给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 ++具有适当的数据结构作为标准,请使用它们。

正如已经解释过的,您的打印问题是由于打印字符的特殊规则所致,在打印之前只能转换为未签名。

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

答案 2 :(得分:2)

尝试使用std :: vector并将字符放在''

#include <iostream>
#include <vector>

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

int main()
{
    std::vector<unsigned char> numbers { '1','2','3','4','5','6','7','8' };
    for (size_t i = 0; i < numbers.size(); ++i)
    {
        std::cout << numbers[i] << "\n";
    }
    logger(numbers);
}

我得到以下输出:

1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

答案 3 :(得分:1)

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

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