C函数的原型声明会返回一个n
- 维数组吗?
此处n>=2
。
请用动态数组/指针解释一下。
我的想法是不传递任何维数组。
请给我3个2
,3
和4
尺寸的示例。
这对我来说已经足够了。
答案 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
中,这是另一个指针。
例如,采用四维数组(维度大小为size
,10
,20
和30
),然后您可以创建并初始化 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的大小无关。