多维数组
在实际项目的应用中,常用的数组包括一维、二维、三维和四维数组,其主要应用包括创建/动态创建、初始化/赋值、调用/引用等。
1、一维数组
1.1. 初始化、赋值
//数组长度为常量 _LENGTH
float temp1[_LENGTH] = {0};
float temp2[_LENGTH] = {1, 2, 3, 4, 5};
//数组长度为变量 length
float temp[length];
memset(temp,0,length*sizeof(float));
1.2. 动态开辟内存空间
//开辟空间
float *temp;
*temp = (float*)malloc(length*sizeof(float));
memset(temp,0,length*sizeof(float));
//使用时
temp[0] = 1;
//释放
free(temp);
temp = NULL;
注:在释放时,一定要记得将指针清空,因为free()
函数只是释放内存,对指针没有操作,为避免对指针重新分配时的数据错误,需手动将指针置零。
- 使用函数开辟空间和释放
void MallocArray(void** a, int len)
{
*a = malloc(len);
memset(*a, 0, len);
return;
}
void FreeArray(void* a)
{
free(a);
a = NULL;
return;
}
//使用
MallocArray((void**)&temp,length*sizeof(float));
2、二维数组
2.1. 初始化、赋值
//数组长度为常量 _ROW,_COL
float temp1[_ROW][_COL] = {0};
float temp2[_ROW][_COL] = {{1,2},{1, 2}, {3, 4}, {5,6}};
//数组长度为变量 row,col
float temp[row][col];
memset(temp,0,row*col*sizeof(float));
memset(temp,0,sizeof(temp));
注:1、memset(数组,0,字节长度)
2、float temp2[_ROW][_COL] = {{1,2},{1, 2}, {3, 4}, {5,6}};
这种方式只能用于初始化,不能用于赋值
2.2. 动态开辟内存空间
- 方法1
float **temp;
int i ,j;
**temp = (float**)malloc(row*sizeof(float*));
for(i = 0;i <n1;i++ )
{
*a[i] = (float*)malloc(sizeof(float)*col);
for(j =0; j <n2; j++)
{
a[i][j] = 0;
}
}
方法1的每行的列与列之间的地址时连续的,行与行之间的地址不连续
- 方法2
float (*temp)[col] = (float(*)[col])malloc(sizeof(float) * row * col); //(*temp) 括号不能少,[]优先级高,少了就是指针数组了
方法2中的每个元素都是连续的,但如以指针的形式给函数传二维数组,要用方法1,方法2会报错。
3、三维数组
3.1. 动态开辟内存空间
int i ,j,k;
float ***a = (float***)malloc(n1*sizeof(float**));
for(i = 0;i <n1;i++ )
{
**a[i] = (float**)malloc(sizeof(float*)*n2);
for(j =0; j <n2; j++)
{
*a[i][j] = (float*)malloc(sizeof(int)*n3);
for(k =0;k<n3;k++)
{
a[i][j][k] = 0;
}
}
}
4、四维数组
4.1. 动态开辟内存空间
int i ,j,k,z;
float ****a = (float****)malloc(n1*sizeof(float***));
for(i = 0;i <n1;i++ )
{
***a[i] = (float***)malloc(sizeof(float**)*n2);
for(j =0; j <n2; j++)
{
**a[i][j] = (float**)malloc(sizeof(float*)*n3);
for(k =0;k<n3;k++)
{
*a[i][j][k] = (float*)malloc(sizeof(float)*n4);
for(z = 0;z< n4;z++)
{
a[i][j][k][z] = 0;
}
}
}
}
还可以用结构体的方法定义四维数组
//未验证
typedef struct {
int a[5];
}item;
item *ar = (item*)malloc(sizeof(item) * 4);