指针 多维数组

这篇文章写的很好
http://www.cnblogs.com/wangkangluo1/archive/2012/04/12/2444946.html
### C语言中指针多维数组的使用方法 在C语言中,指针多维数组的关系非常密切。通过理解它们之间的联系,可以更高效地操作数据结构。 #### 一、基本概念 1. **多维数组的本质** 多维数组本质上是一块连续的内存区域[^1]。例如,`int a[3][4];` 定义了一个具有 `3×4=12` 个整数大小的一维存储空间。 2. **指针对应关系** 对于二维数组 `a[m][n]`,可以通过指针访问其元素。假设有一个二维数组 `a[3][4]`,则 `(a)` 是指向该数组首行的一个指针,`(a[i])` 表示第 `i` 行的起始地址,而 `(*(*(a+i)+j))` 则表示具体位置 `[i][j]` 的值[^3]。 #### 二、代码实现详解 以下是几个典型例子来展示如何利用指针处理多维数组: ##### 示例1:遍历二维数组并打印每个元素 ```c #include <stdio.h> void printArray(int (*arr)[3], int rows) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < 3; ++j) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 将整个二维数组传递给函数 printArray(array, 3); return 0; } ``` 解释:这里我们将二维数组作为参数传入函数时,实际上是指向每一行的第一个元素的指针集合。 --- ##### 示例2:动态分配三维数组 当需要创建一个更大的维度或者不确定尺寸的情况下,可以用动态内存管理工具如 `malloc()` 来完成任务。 ```c #include <stdio.h> #include <stdlib.h> #define DEPTH 2 #define ROWS 3 #define COLS 4 int ***create_3D_array(int depth, int rows, int cols) { int ***array; // 分配最外层指针数组的空间 array = (int ***) malloc(depth * sizeof(int **)); if (!array) exit(1); for (int d = 0; d < depth; ++d) { // 分配中间层指针数组的空间 array[d] = (int **) malloc(rows * sizeof(int *)); if (!(array[d])) exit(1); for (int r = 0; r < rows; ++r) { // 分配实际的数据存储区 array[d][r] = (int *) malloc(cols * sizeof(int)); if (!(array[d][r])) exit(1); for (int c = 0; c < cols; ++c) { array[d][r][c] = d * rows * cols + r * cols + c; } } } return array; } void free_3D_array(int ***array, int depth, int rows) { for (int d = 0; d < depth; ++d) { for (int r = 0; r < rows; ++r) { free(array[d][r]); } free(array[d]); } free(array); } int main() { int ***myArray = create_3D_array(DEPTH, ROWS, COLS); for (int d = 0; d < DEPTH; ++d) { for (int r = 0; r < ROWS; ++r) { for (int c = 0; c < COLS; ++c) { printf("myArray[%d][%d][%d] = %d\n", d, r, c, myArray[d][r][c]); } } } free_3D_array(myArray, DEPTH, ROWS); return 0; } ``` 说明:这段代码展示了如何手动构建以及释放一块三维数组所需的全部资源[^1]。 --- ##### 示例3:指针替代法简化表达式 对于某些场景来说,直接采用多重解引用可能会显得冗长复杂。此时我们可以引入辅助变量减少重复书写量。 ```c #include <stdio.h> int main(){ int b[2][3][4]={ {{{1,2},{3,4}},{{5,6},{7,8}}}, {{{9,10},{11,12}},{{13,14},{15,16}}} }; int h,r,l; int *(*p)[4]=b;//定义一个指向两层数组类型的指针 for(h=0;h<2;++h){ for(r=0;r<3;++r){ *(p+h)[r]={}; for(l=0;l<4;++l){ printf("%d\t",*(*(p+h)[r]+l));//等价于b[h][r][l] } putchar('\n'); } putchar('\n'); } return 0; } ``` 解析:这里的 `int *(*p)[4]` 声明了一种特殊形式的指针类型,它能够一次性跳过前面两个索引层次直达目标单元格[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值