C函数的原型声明会返回一个n维数组吗?

时间:2011-12-01 07:56:43

标签: c arrays function return

C函数的原型声明会返回一个n - 维数组吗?

此处n>=2

请用动态数组/指针解释一下。

我的想法是不传递任何维数组。

请给我3个234尺寸的示例。

这对我来说已经足够了。

3 个答案:

答案 0 :(得分:3)

我会建议:

array foo();

其中array是一个定义为:

的结构
struct array
{
    int *data;
    unsigned int ndim;  //number of dimensions
    unsigned int *size; //size of each dimension is size[i].
};

当然,data只是指向int的指针,但结构中的其他两个字段可以这样使用,data可以解释为{ {1}}维数组,每个维度的大小可以存储在n中,这是另一个指针。

例如,采用四维数组(维度大小为size102030),然后您可以创建并初始化 4D array as:

40

其中unsigned int size[] = {10,20,30,40}; array arr = create(4, size); 函数定义为:

create

当然,你需要对结构的字段进行大量工作,使其看起来像n维数组。你不需要按照我解释的方式完全按照我的方式,但这只是一个基本的想法。您可以修改它,以满足您的特定需求。

我建议你写一些函数,操作数组,以及访问数组元素。我写了array create(unsigned int n, unsigned int *size) { array arr; arr.ndim = n; arr.size = (unsigned int*) malloc(n * sizeof(unsigned int)); int i; unsigned int totalElements = 1; for( i = 0 ; i < n ; ++i) { arr.size[i] = size[i]; totalElements *= size[i]; } arr.data = (unsigned int*) malloc(totalElements * sizeof(int)); return arr; } 函数,同样这里是create函数:

destroy

答案 1 :(得分:0)

你可以返回一个简单的指针,并在函数内部为n维数组分配内存:

int* foo( int nSize )
{
   int*** x;
   x = (int***)malloc( sizeof(int**) * nSize );
   for ( int i = 0 ; i < nSize ; i++ )
   {
      x[i] = (int**)malloc( sizeof(int*) * nSize );
      for ( int j = 0 ; j < nSize ; j++ )
      {
     x[i][j] = ( int* ) malloc(sizeof(int) * nSize );
     for ( int k = 0 ; k < nSize ; k++ )
     {
        x[i][j][k] = i + j+ k;
     }
      }
   }

   return (int*)x;
}

在函数之外,由于你已经知道了大小,你可以假设你的指针大小正确 - 在这种情况下,是一个三维数组:

int main(int argc, _TCHAR* argv[])
{
   int*** x =(int***) foo(4);
   for ( int i = 0 ; i < 4 ; i++ )
      for ( int j = 0 ; j < 4 ; j++ )
     for ( int k = 0 ; k < 4 ; k++ )
        cout << x[i][j][k] << endl;

   return 0;
}

是的,演员阵容并不好,但它有效:)

答案 2 :(得分:0)

你的问题缺少一些细节(比如数组的类型,无论n是否作为参数传入,无论数组是否在函数中创建),所以我会尝试猜猜你的意思。

数组由指针和偏移量引用。即。

double a[10];
a[1] = 1.0f;
double *b = &(a[0]);
double c = b[1];

让我们假设您希望函数创建一个包含double类型的n个元素的数组。

double * createArray(int n);

有你的功能原型。您的功能可能看起来像

double * createArray(int n)
{
    double * newarray = new double[n];
    return &(newarray[0]);
}

你可以像这样使用createArray

double * arrayoftendoubles = createArray(10);
double fifthelement = arrayoftendoubles[4];

与n的大小无关。