从一维数组创建二维数组

3
如果我有几个相同数据类型的数组,最好的方法是将它们全部复制到一个二维数组中。例如:
int array1[] = {1,2,3,4,5,6,7,8,9,10};
int array2[] = {9,8,7,6,5,4,3,2,1,0};

int array2d[][];
//pseudo code array2d = array1 + array2

为了让...
array2d[0][0]; //=1 (first member of array1)
array2d[1][0]; //=9 (first member of array2)

考虑到数组只是指向第一个元素的指针,我认为我可以这样做,但它会导致编译错误。

array2d[0][0] = array1;
array2d[1][0] = array2;

我猜无法使用引用进行复制,因为数组需要在连续的内存中分配空间?是否有类似于memset的函数可以使用?


6
"考虑到数组只是指向第一个元素的指针" ... 不不不,数组并不是指向第一个元素的指针,这就解释了为什么它不起作用(进一步阅读:https://dev59.com/THI-5IYBdhLWcg3w18d3 和 https://dev59.com/8m445IYBdhLWcg3wia2V)。" - R. Martinho Fernandes
5个回答

3

不可能。您需要逐个复制一个数组中的元素到另一个数组中。

此外,您可以使用整数数组指针的数组来模拟二维数组。

int array1[] = {1,2,3,4,5,6,7,8,9,10};
int array2[] = {9,8,7,6,5,4,3,2,1,0};

int *array2d[2]; 

array2d[0] = array1;
array2d[1] = array2;

或者这样

int array1[] = {1,2,3,4,5,6,7,8,9,10};
int array2[] = {9,8,7,6,5,4,3,2,1,0};

int *array2d[] = {array1, array2}; 

cout << "[0][0]=" << array2d[0][0] << endl;
cout << "[1][0]=" << array2d[1][0] << endl;

OR REVERSE(或反转)

如果您的目标是向某个API呈现2D数组,则应该重构您的代码。例如,您可以使用指针模拟1D数组:

// an ampty array
int array2d[2][10];

// pointers to parts
int *array1 = array2d[0];
int *array2 = array2d[1];

int n;

// fill "arrays"
for(int i=0, n=1; i<10; ++i, ++n) {
    array1[i] = n;
}
for(int i=0, n=9; i<10; ++i, --n) {
    array2[i] = n;
}

// now you are ready
cout << "[0][0]=" << array2d[0][0] << endl;
cout << "[1][0]=" << array2d[1][0] << endl;

2
如果你想要一个实际的二维数组(在内存中连续),那么你必须复制元素。不过,你可以用一个包含两个指针的数组来模拟它:
int *array2d[2];
array2d[0] = array1;
array2d[1] = array2;

1

它不是一个实际的二维数组,但你可以将array2d变成一个指向一维数组的指针数组:

int* array2d[2];

array2d[0] = array1;
array2d[1] = array2;

否则你将不得不手动复制这些元素。

这通常是我的做法,但它需要发送到一个期望类似 '**datatype' 数组的 API 函数。 - cool mr croc
API期望**datatype还是datatype[][]?你可能应该阅读评论中链接的问题,那里有很多有用的信息。 - WildCrustacean

1

有几件事情可以做。如果您知道每个数组内的数据将保持不变,您可以使用#define定义它,然后在1D和2D数组中使用它。或者,您可以将1D数组中的元素复制到2D数组中。第二点在此处说明:

#define ARRAY_1 { 1, 2, 3, 4, 5, 6 }
#define ARRAY_2 {7, 8, 9, 10, 11, 12 }

int array_1[] = ARRAY_1;
int array_2[] = ARRAY_2;

int two_dim_array[][] = {
    ARRAY_1,
    ARRAY_2,
}

1

定义和分配:

int array1[] = {1,2,3,4,5,6,7,8,9,10};
int array2[] = {9,8,7,6,5,4,3,2,1,0};

int *array2d[2];
array2d[0] = array1;
array2d[1] = array2;

测试:

printf("%d\t",array2d[0][0]);
printf("%d\t",array2d[0][9]);
printf("%d\t",array2d[1][5]);

它会给出1 10 4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接