网站首页 > 技术文章 正文
我们知道,数据在内存中是一维线性顺序存储的,如何表示二维数组呢?在编程语言中,二维数组如果按照行主序进行存储,则用行i、列j的行列式来表示每一个元素,如有数组arr[i][j](数组名arr即表示一块内存区域的首地址,其元素偏移可用i、j的表达式来表示),其每一个元素可用指针表示:arr+i*icols+j (i、j的初始值为0),解引用后就是a[i][j]。当然,可以当做一个降维的数组来处理,其元素为一个数组指针:arr[i]。
有5种方式可以在函数参数中调用一个二维数组:
#include <stdio.h>
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
// 1 传二维数组,第二维必须标明
// 函数调用:arr2D_1(arr,3);
void arr2D_1(int arr[][4],const int irows)
{
for (int i=0;i<irows;++i)
{
for(int j=0;j<4;++j)
{
printf("%5d",arr[i][j]);
}
}
printf("\n");
}
// 2 传数组指针,第二维必须标明
// 函数调用:arr2D_2(arr,3);
void arr2D_2(int (*parr)[4],const int irows)
{
for (int i=0;i<irows;++i)
{
for(int j=0;j<4;++j)
{
printf("%5d",parr[i][j]);
}
}
printf("\n");
}
// 3 降维处理,传指针指向降一维的数组元素
// 函数调用:arr2D_3(arr[0],3,4);或arr2D_3((int*)arr,3,4);
void arr2D_3(int *arr,const int irows,const int icols)
{
for(int i=0;i<irows;++i)
{
for(int j=0;j<icols;++j)
{
printf("%5d",*(arr+i*icols+j));
}
}
printf("\n");
}
// 4 使用二维指针传值
// 函数调用:arr2D_4((int**)arr,3,4);否则int[3][4]与int **类型不匹配
void arr2D_4(int **arr, int rows, int cols)
{
for (int i=0;i<rows;++i)
{
for(int j=0;j<cols;++j)
{
printf("%5d",*((int*)arr + cols*i + j));
}
}
printf("\n");
}
// 5 使用指针数组
// 函数调用,实参也使用指针数组,但指针数组的元素需循环预先赋值
void arr2D_5(int* arr[], int rows, int cols)
{
for(int i=0;i<rows; i++)
for(int j=0;j<cols; j++)
printf("%5d",arr[i][j]);
}
int main()
{
int* q,(*p)[4];
for(p=arr;p<arr+3;p+=1)
for(q=p[0];q<p[0]+4;q+=1)
printf("%5d",*q);
printf("\n");
p=arr;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
printf("%5d",p[i][j]);
printf("\n");
arr2D_1(arr,3);
arr2D_2(arr,3);
arr2D_3(arr[0],3,4);
arr2D_3((int*)arr,3,4);
arr2D_4((int**)arr,3,4);
int* parr[3];
for(int k=0;k<3; k++)
parr[k]=arr[k];
arr2D_5(parr,3,4);
getchar();
return 0;
}
/*output:
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12
*/
-End-
猜你喜欢
- 2024-10-12 Excel查找重复次数最多的项目 excell查找重复数据
- 2024-10-12 经典动态规划题——打家劫舍 打家劫舍猜一肖
- 2024-10-12 函数公式的左膀右臂:ROW、COLUMN函数知多少
- 2024-10-12 C|二维数组做函数参数求矩阵乘积 c二维数组作为函数参数
- 2024-10-12 sum() 函数性能堪忧,列表降维有何良方?
- 2024-10-12 【译】Vue 何以对 React“降维打击”?
- 2024-10-12 奇异值分解与主成分分析,一文带你理解Spark分布式降维方法
- 2024-10-12 收下这波 JS 技巧,从此少加班 js怎么做加法
- 2024-10-12 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
- 2024-10-12 盘ES6、ES7、ES8、ES9、ES10 es6解构赋值
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)