lus*_*oog 3 c arrays multidimensional-array
典型的1-D数组可以在声明中静态或自动分配.
enum { n=100 };
int arr1[n];
Run Code Online (Sandbox Code Playgroud)
或者通过指针动态分配和访问.
int *arr1m=malloc(n*sizeof*arr1m);
int *arr1c=calloc(n, sizeof*arr1c);
Run Code Online (Sandbox Code Playgroud)
这两种样式都使用相同的语法访问元素.
int i = n/2;
arr1[i] = arr1c[i] = arr1m[i] = 42;
Run Code Online (Sandbox Code Playgroud)
但是当你添加第二个维度时,需要花费一些力气来实现相同的语法.
int arr2[n][n];
int *arr2c=calloc(n*n,sizeof*arr2c);
arr2[5][5] = arr2c[5*n+5] = 23;
Run Code Online (Sandbox Code Playgroud)
如果您将其构造为Iliffe向量,则只能获得双重括号.
int **arr2l=calloc(n,sizeof*arr2l);
for (int j=0; j<n; j++)
arr2l[j]=calloc(n,sizeof**arr2l);
arr2[6][6] = arr2l[6][6] = 72;
Run Code Online (Sandbox Code Playgroud)
但随着尺寸的增加,这变得越来越麻烦.
另一个困难是在访问元素之前检查动态数组的边界(这样您就不会触及未正确分配的内存).在真正的阵列可以使用sizeof运营商确定的界限,但这些动态数组携带它们的大小与他们.
如何定义具有快速,连续布局的结构,如数组,但具有一致的语法,用于访问具有索引列表的元素,这些索引对于2D阵列和3D阵列的工作方式相同; 并且所有动态,动态大小可以传递给函数并从函数返回?
没有必要重新发明轮子,C从C99开始,它被称为可变长度阵列,VLA.它只是语法为"普通"d维数组,只是边界可能是变量的,并且它们不允许在文件范围内.
因为这样的对象可能变得相对较大,所以不应该在堆栈上分配它们,而是使用类似的东西 malloc
double (*A)[n][m] = malloc(sizeof(double[k][n][m]));
Run Code Online (Sandbox Code Playgroud)
编译器然后帮助您进行所有索引计算而不会出现问题.如果你想将这些动物传递给函数,你必须先小心地声明边界:
void func(size_t k, size_t n, size_t m, double A[k][n][m]);
Run Code Online (Sandbox Code Playgroud)
这使得您的意图对人类读者和编译者都清楚.我比同等形式更喜欢这个
void func(size_t k, size_t n, size_t m, double (*A)[n][m]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |