58.多维数组

1.多维数组的定义

 

Java中支持多维数组,也就是“数组的数组”。


多维数组的声明是通过每一维一组方括号的方式来实现的。


二维数组:int[][],double[][]等。
三维数组:float[][][],String[][][]等。

 

2.多维数组的创建

当使用new 来创建多维数组时,不必指定每一维的大小,而只需要指定最左边的维的大小就可以了。如果你指定了其中的某一维的大小,那么所有处于这一维左边的各维的大小都需要指定。


下面是一些创建多维数组的例子:
boolean[][] b = new boolean[10][3];
int[][] a = new int[5][];
String[][][] = new String[4][5][6]
double[][][] = new double[40][][]

 

3.多维数组初始化

 

在知道数组元素的情况下,可以直接初始化数组,不必调用new来创建数组,这和一维数组的静态初始化类似:
int[][] a = {{1,2},{10,2},{20,1}}


在引用多维数组的时候,通过指定数组名和各维的索引来引用。


除了静态初始化外,多维数组也可以通过数组声明和初始化分开的动态初始化方法来对数组进行初始化,如:
 int a[][] = new int[4][5];
 int b[][] = new int[3][]
 b[0] = new int[4];
 b[1] = new int[3];
 b[2] = new int[5];

在C语言中,实现多维数组有以下几种常见方法: ### 静态多维数组 可以直接定义并初始化多维数组,例如定义一个四维数组: ```c #include <stdio.h> int main() { int arr[2][3][4][5] = { { { {0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13, 14}, {15, 16, 17, 18, 19} }, { {20, 21, 22, 23, 24}, {25, 26, 27, 28, 29}, {30, 31, 32, 33, 34}, {35, 36, 37, 38, 39} }, { {40, 41, 42, 43, 44}, {45, 46, 47, 48, 49}, {50, 51, 52, 53, 54}, {55, 56, 57, 58, 59} } }, { { {60, 61, 62, 63, 64}, {65, 66, 67, 68, 69}, {70, 71, 72, 73, 74}, {75, 76, 77, 78, 79} }, { {80, 81, 82, 83, 84}, {85, 86, 87, 88, 89}, {90, 91, 92, 93, 94}, {95, 96, 97, 98, 99} }, { {100, 101, 102, 103, 104}, {105, 106, 107, 108, 109}, {110, 111, 112, 113, 114}, {115, 116, 117, 118, 119} } } }; printf("arr[0][0][0][1] = %d\n", arr[0][0][0][1]); return 0; } ``` 这种方式在定义时就确定了数组大小和初始值,适合数组大小固定的情况[^4]。 ### 动态多维数组 #### 动态二维数组 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int Rows = 2, Cols = 3; // 指针法 double **mat2d2 = NULL; mat2d2 = (double**)malloc(Rows * sizeof(double*)); for (int r = 0; r < Rows; r++) { mat2d2[r] = (double*)malloc(Cols * sizeof(double)); memset(mat2d2[r], 0, Cols * sizeof(double)); } // 使用完后释放内存 for (int r = 0; r < Rows; r++) { free(mat2d2[r]); } free(mat2d2); return 0; } ``` 通过`malloc`函数动态分配内存,适合在运行时确定数组大小的情况。这里是先分配一个指针数组,再为每个指针分配内存块来存储数据。同时,使用完后需要释放分配的内存,避免内存泄漏[^5]。 #### 动态三维及以上数组动态三维数组为例: ```c #include <stdio.h> #include <stdlib.h> #define ARRAY_SIZE 5*32*32 // 定义了5桢,每桢是32x32的矩阵 int main() { unsigned char (*frame)[32][32]; frame = (unsigned char (*)[32][32])malloc(ARRAY_SIZE); if (frame == NULL) { printf("Memory allocation failed\n"); return 1; } // 使用数组 frame[0][0][0] = 1; // 释放内存 free(frame); return 0; } ``` 使用`malloc`分配连续的内存块来存储三维数组的数据,使用完后同样需要释放内存[^2]。 ### 多维数组的赋值函数实现 ```c #include <stdio.h> #include <stdarg.h> #define MAX_DIM 3 typedef int ElemType; typedef struct { ElemType *base; int dim; int *bounds; int *constants; } Array; // 初始化数组 int InitArray(Array &A, int dim, ...) { if (dim < 1 || dim > MAX_DIM) return 0; A.dim = dim; A.bounds = (int *)malloc(dim * sizeof(int)); if (!A.bounds) return 0; int elemtotal = 1; va_list ap; va_start(ap, dim); for (int i = 0; i < dim; i++) { A.bounds[i] = va_arg(ap, int); if (A.bounds[i] < 0) return 0; elemtotal *= A.bounds[i]; } va_end(ap); A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType)); if (!A.base) return 0; A.constants = (int *)malloc(dim * sizeof(int)); if (!A.constants) return 0; A.constants[dim - 1] = 1; for (int i = dim - 2; i >= 0; i--) { A.constants[i] = A.bounds[i + 1] * A.constants[i + 1]; } return 1; } // 定位元素位置 int Locate(Array &A, va_list ap, int &off) { off = 0; for (int i = 0; i < A.dim; i++) { int ind = va_arg(ap, int); if (ind < 0 || ind >= A.bounds[i]) return 0; off += A.constants[i] * ind; } return 1; } // 给数组赋值 int Assign(Array &A, ElemType e, ...) { va_list ap; va_start(ap, e); int off, result; if ((result = Locate(A, ap, off)) <= 0) return result; *(A.base + off) = e; va_end(ap); return 1; } // 获取数组元素值 int Value(Array &A, ElemType &e, ...) { va_list ap; va_start(ap, e); int off, result; if ((result = Locate(A, ap, off)) <= 0) return result; e = *(A.base + off); va_end(ap); return 1; } int main() { Array A; int e; InitArray(A, 3, 5, 6, 7); Assign(A, 100, 1, 2, 3); Value(A, e, 1, 2, 3); printf("\nA[1,2,3]=%d", e); return 0; } ``` 通过定义结构体和相关函数,可以实现多维数组的初始化、赋值和取值操作,这种方式更灵活,可用于处理不同维度和大小数组[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值