网站首页 > 技术文章 正文
二维数组应该是一种最常用的数据结构了,二维相对一维,确实复杂了不只一个维度。
二维数组是数组的数组,其元素是一个数组,如果用指针指向,需要有长度信息,才可以用正常的指针算术运算(元素指针偏移)。
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++二维数组函数)
- 04-29kali2021ping 外网不通
- 04-29我是如何用这3个小工具,助力小姐姐提升100%开发效率的
- 04-29注册下载啊
- 04-29Spring 中三种 BeanName 生成器!
- 04-29mysql学习9:创建数据库
- 04-29Linux之yum源详解
- 04-29夏日终曲/请以你的名字呼唤我/Call me by your name(无剧透)
- 04-29注释竟然还有特殊用途?一文解惑 //go:linkname 指令
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- sqlset (59)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)