c++ - 如何在 C(首选)/C++ 中按顺序将一组一维数组传递给函数

标签 c++ c arrays pointers memory

我有一组不同大小的一维数组,例如:

P1 [] = {0,2,5,6,9,8,7,55,7,4,1} 
P2 [] = {11,22,55,5,8,7,4,65,87,7,88,9,8,77,4,5,6,33,2,1,44,5,8,55} 
P3 [] = {0} 
//...
//...
Pn [] = { "","","","",...."",""} 

我想按顺序将这些数组传递给一个函数,比如 -
函数 (Pi) ,其中 I 从 1n
我该怎么做?
所有一维数组在运行时之前都是已知的。内存需要优化,因此使用二维数组效率不高。

最佳答案

将所有这些数组的第一个元素的地址(即指向数组第一个元素的指针)存储在另一个数组中,定义一个名为 pv 的“指针数组”:

void * pv[] =
{
  P1, P2, P3, ..., Pn, NULL
};

然后遍历这个数组的元素。

size_t i = 0;
while (NULL != pv[i])
{
  function(pv[i]);
  ++i;
}

但是请注意,您将丢失传递给 function 的数组的大小。

以下方法将不起作用:

void function(void * p)
{
  size_t s = sizeof p;
  ...

s 是指针的大小,通常为 4 或 8,具体取决于您的平台。

虽然仅仅达到了 C 的限制试图绕过这个并保持或多或少的健壮代码,但以下是可能的:

enum Type
{
  TypeInt,
  TypeCharPtr,
  ...
};

struct Array_Descriptor
{
  size_t s;
  void * p;
  enum Type t;
};

int P1 [] = {0,2,5,6,9,8,7,55,7,4,1};
int P2 [] = {11,22,55,5,8,7,4,65,87,7,88,9,8,77,4,5,6,33,2,1,44,5,8,55};
int P3 [] = {0};
...
char * Pn [] = { "","","","",...."",""};

struct Array_Descriptor ads[] =
{
  {sizeof P1/sizeof *P1, P1, TypeInt},
  {sizeof P2/sizeof *P2, P2, TypeInt},
  {sizeof P3/sizeof *P3, P3, TypeInt},
  ...
  {sizeof Pn/sizeof *Pn, Pn, TypeCharPtr},
};

...

size_t s = sizeof ads/sizeof *ads;
for (size_t i = 0; ; i < s; ++i)
{
  function(ads + i);
}

function 的定义将更改为:

void function(struct Array_Descriptor * pad);

可以通过以下方式访问数据、元素数量和类型

void function(struct Array_Descriptor * pad)
{
  void * p = pad->p;
  size_t s = pad->s;
  enum Type = pad->t;

关于c++ - 如何在 C(首选)/C++ 中按顺序将一组一维数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666464/

相关文章:

c++ - boost::tuple 中模板化参数的数量

c++ - 如何正确构建相互引用的类? (C++)

c - 为什么我的讲师写的所有 C 文件的第一行都以一个 # 开头?

c++ - 指向数组的指针的声明 - 访问问题

javascript - 如何读出 javascript 中的前 4 个字节,将其转换为整数并删除其余部分?

python - 在 Cython 中包装 std::array 并将其暴露给内存 View

c++ - 我们如何实现一个 C++ 类,以便它允许我们在运行时添加数据成员

c++ - C++ 头文件中的声明和初始化过多

c - Linux内存布局(C中使用的malloc(),但不是以预期地址开始)

c - 使用 buffer[100] = {0, } 的初始化如何在 C 语言中工作?