网站首页 > 技术文章 正文
二维数组应该是一种最常用的数据结构了,二维相对一维,确实复杂了不只一个维度。
二维数组是数组的数组,其元素是一个数组,如果用指针指向,需要有长度信息,才可以用正常的指针算术运算(元素指针偏移)。
1 行序优先、列序优先,倒序处理,对角线数据处理
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int row = 3;
const int COL = 4;
int arr[][COL] = {1,2,3,4,5,6,7,8,9,10,11,12};
for(i=0;i<row;i++) // 行序优先
{
for(j=0;j<COL;j++)
printf("%2d ",arr[i][j]);
printf("\n");
}
for(i=0;i<COL;i++) // 列序优先
{
for(j=0;j<row;j++)
printf("%2d ",arr[j][i]);
printf("\n");
}
for(i=row-1;i>=0;i--) // 倒序输出
{
for(j=COL-1;j>=0;j--)
printf("%2d ",arr[i][j]);
printf("\n");
}
int sum = 0;
for(i=0;i<row;i++) // 对角线数据求和
{
sum += arr[i][i] + arr[i][row-i-1];
}
printf("%d\n",sum);
getchar();
return 0;
}
/*output:
1 2 3 4
5 6 7 8
9 10 11 12
1 5 9
2 6 10
3 7 11
4 8 12
12 11 10 9
8 7 6 5
4 3 2 1
36
*/
2 二维指针处理二维数组
首先需要注意的是,二维指针的解引用是一个指针,二维数组名的元素是一个有长度信息的数组,二者不具有等同性,可以有关联性。
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int** func2P(int row)
{
int i,j;
int**pp = (int**)malloc(sizeof(int*)*row);
for(i=0;i<row;i++)
pp[i] = (int*)malloc(sizeof(int)*COL);
for(i=0;i<row;i++)
for(j=0;j<COL;j++)
pp[i][j] = (i+1)*(j+1);
return pp;
}
int main()
{
int row = 3;
int**arr = func2P(row);
for(int i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
printf("%2d ",arr[i][j]);
printf("\n");
}
free(arr);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
3 数组指针处理二维数组
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int(*funcArr2D(int row))[COL] // 返回一个数组指针
{
int (*buf)[COL];
buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
for(int i=0;i<row;i++)
for(int j=0;j<COL;j++)
buf[i][j] = (i+1)*(j+1);
return buf;
}
int main()
{
int row = 3;
int(*arr)[4] = funcArr2D(row);
for(int i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
//printf("%2d ",arr[i][j]);
printf("%2d ",*(*(arr+i)+j));
printf("\n");
}
free(arr);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
如果是C++,也可以使用数组指针获得一个二维数组:
void test()
{
int (*a)[6] = new int[5][6];
for(int i=0;i<5;i++)
for(int j=0;j<6;j++)
a[i][j] = (i+1)*(j+1);
}
4一维数组和二维数组相互赋值
内存本质上是一个顺序存储的线性字节数组。二维数组只是逻辑上的概念,本质上是数组的数组。
#include <stdio.h>
#include <stdlib.h>
#define COL 4
int(*funcArr2D(int row))[COL]
{
int (*buf)[COL];
buf = (int(*)[COL])malloc(row*COL*sizeof(int)); // malloc(row); ?
for(int i=0;i<row;i++)
for(int j=0;j<COL;j++)
buf[i][j] = (i+1)*(j+1);
return buf;
}
int* func1P(int row)
{
int* p = (int*)malloc(sizeof(int)*row*COL);
for(int i=0;i<row*COL;i++)
p[i] = i+1;
return p;
}
int main()
{
int row = 3;
int(*arr2)[4] = funcArr2D(row);
int* arr1 = func1P(row);
for(int i=0;i<row*COL;i++)
arr2[i/COL][i%COL] = arr1[i];
for(i=0;i<row;i++)
{
for(int j=0;j<COL;j++)
printf("%2d ",arr2[i][j]);
printf("\n");
}
free(arr2);
free(arr1);
getchar();
return 0;
}
/*output:
1 2 3 4
2 4 6 8
3 6 9 12
*/
5 使用指针数组处理二维数组
#include <stdio.h>
int main()
{
int b[2][3]= {{1,2,3},{2,4,6}};
int *pb[2];
int i,j;
pb[0]=b[0];
pb[1]=b[1];
for(i=0; i<2; i++)
{
for(j=0; j<3; j++,pb[i]++)
printf("%2d",*pb[i]);
printf("\n");
}
return 0;
}
-End-
猜你喜欢
- 2024-10-19 Excel中使用VBA你不可不知道的使用数组,干货分享
- 2024-10-19 Excel VBA入门教程1.3 数组基础(vba数组操作方法大全)
- 2024-10-19 C语言中为何不能直接对一个数组对象赋值
- 2024-10-19 第七节:C语言基础——二维数组(c语言二维数组怎么用)
- 2024-10-19 学会这两招,PLC编程也可以批量化定义变量-数组、结构
- 2024-10-19 1键搞定数组赋值,并回填数据给工作表
- 2024-10-19 C++|二维数组转一维数组及二维数组用数组指针输出
- 2024-10-19 数组结构分为一维数组二维数组一维数组赋值使用
- 2024-10-19 西门子SCL编程之赋值语句概述及赋值语句的使用方法
- 2024-10-19 什么是C++二维数组?数组中的数组(c++二维数组函数)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 530℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 493℃MySQL service启动脚本浅析(r12笔记第59天)
- 473℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 470℃启用MySQL查询缓存(mysql8.0查询缓存)
- 451℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 430℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 427℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)