我有一组不同大小的一维数组,例如:
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 从 1
到 n
。
我该怎么做?
所有一维数组在运行时之前都是已知的。内存需要优化,因此使用二维数组效率不高。
最佳答案
将所有这些数组的第一个元素的地址(即指向数组第一个元素的指针)存储在另一个数组中,定义一个名为 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/