将一维数组插入二维数组
Inserting 1D array to 2D array
我们可以直接将一维数组插入二维数组吗?
例如我有这个代码:
void insert(int[]data , int**collection)
{
collection[1] = data
}
int main()
{
int data[2]= {1,3}
int collection[2][2];
insert(data,&collection);
}
这行得通吗?
您不能像现在这样将 1D
数组插入到 2D
数组。使用memcpy
将1D
数组的元素复制到2D
数组,像这样:
memcpy(collection[1], data, 2 * sizeof(int));
这会将 data
数组的 2
个整数元素复制到 collection[1]
。
此外,您的代码中还有一些问题。让我们讨论一下:
第一个:
insert(data,&collection);
^
您不需要传递 collection
的地址。请注意,数组在表达式中使用时,将转换为指向其第一个元素的指针(此规则几乎没有例外)。这意味着,当您传递 collection
时,它将转换为类型 int (*)[2]
。只要做:
insert(data, collection);
第二个:
void insert(int[]data , int**collection)
int[]data
是错误的。 insert()
的第一个参数应该是int data[2]
或int data[]
,两者等价于int * data
。您可以使用其中任何一个。
insert()
的第二个参数是 collection
数组,它是一个 2D
整数数组。当你将它传递给 insert()
时,它将衰减为类型为 int (*)[2]
的指针。 insert()
的第二个参数的类型是 int **
,它与您传递给 insert()
函数的参数不兼容。 insert()
函数的第二个参数应该是int collection[2][2]
或int collection[][2]
,两者等价于int (*collection)[2]
.
把这些放在一起,你可以做到:
#include <stdio.h>
#include <string.h>
#define ROW 2
#define COL 2
void insert(int data[ROW], int collection[ROW][COL]) {
//for demonstration purpose, copying elements of data array
//to all elements (1D array) of collection array.
for (int i = 0; i < ROW; ++i) {
memcpy(collection[i], data, COL * sizeof(int));
}
}
int main(void) {
int data[COL] = {1, 3};
int collection[ROW][COL];
insert(data, collection);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
printf("collection[%d][%d] : %d ", i, j, collection[i][j]);
}
printf("\n");
}
return 0;
}
输出:
# ./a.out
collection[0][0] : 1 collection[0][1] : 3
collection[1][0] : 1 collection[1][1] : 3
我们可以直接将一维数组插入二维数组吗?
例如我有这个代码:
void insert(int[]data , int**collection)
{
collection[1] = data
}
int main()
{
int data[2]= {1,3}
int collection[2][2];
insert(data,&collection);
}
这行得通吗?
您不能像现在这样将 1D
数组插入到 2D
数组。使用memcpy
将1D
数组的元素复制到2D
数组,像这样:
memcpy(collection[1], data, 2 * sizeof(int));
这会将 data
数组的 2
个整数元素复制到 collection[1]
。
此外,您的代码中还有一些问题。让我们讨论一下:
第一个:
insert(data,&collection);
^
您不需要传递 collection
的地址。请注意,数组在表达式中使用时,将转换为指向其第一个元素的指针(此规则几乎没有例外)。这意味着,当您传递 collection
时,它将转换为类型 int (*)[2]
。只要做:
insert(data, collection);
第二个:
void insert(int[]data , int**collection)
int[]data
是错误的。 insert()
的第一个参数应该是int data[2]
或int data[]
,两者等价于int * data
。您可以使用其中任何一个。
insert()
的第二个参数是 collection
数组,它是一个 2D
整数数组。当你将它传递给 insert()
时,它将衰减为类型为 int (*)[2]
的指针。 insert()
的第二个参数的类型是 int **
,它与您传递给 insert()
函数的参数不兼容。 insert()
函数的第二个参数应该是int collection[2][2]
或int collection[][2]
,两者等价于int (*collection)[2]
.
把这些放在一起,你可以做到:
#include <stdio.h>
#include <string.h>
#define ROW 2
#define COL 2
void insert(int data[ROW], int collection[ROW][COL]) {
//for demonstration purpose, copying elements of data array
//to all elements (1D array) of collection array.
for (int i = 0; i < ROW; ++i) {
memcpy(collection[i], data, COL * sizeof(int));
}
}
int main(void) {
int data[COL] = {1, 3};
int collection[ROW][COL];
insert(data, collection);
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
printf("collection[%d][%d] : %d ", i, j, collection[i][j]);
}
printf("\n");
}
return 0;
}
输出:
# ./a.out
collection[0][0] : 1 collection[0][1] : 3
collection[1][0] : 1 collection[1][1] : 3