当前位置:网站首页>C语言-7月18日-二维数组的学习
C语言-7月18日-二维数组的学习
2022-08-11 05:30:00 【曾铎000811】
今天学习了二维数组,先进行知识点的回顾:
二维数组与一位数组一样,也可以使用下标来进行元素的表示 ,数组的下标是从0开始的,例如我在这里给出一个两行三列的二维数组:
int ar[2][3] = {
{1,2,3},{4,5,6}};先来看看如何定义并输出二维数组:

数组的行和列都可以通过下标来进行表示(行和列都是从0开始):例如数字1利用下标来表示就是(0,0),数字6就是(1,2)
数组各个元素的表示:
这里注意一点,在数组中数组名代表的就是数据首元素的地址。
在一维数组中,例如我在这里给出一个一维数组br数组的长度可以通过这样来表示:
int len = sizeof(br) / sizeof(br[0]);在二维数组中,已经不能用数组长度来对数组进行表示,而转化为行和列,也就是坐标,那么如何进行行和列的表示呢?和上面一位数组的表示方法类似:
int row = sizeof(ar) / sizeof(ar[0]);//求二维数组的行
int column = sizeof(ar[0]) / sizeof(ar[0][0]);//求二维数组的列ar代表数据首元素的地址,sizeof(ar)就是数组的总大小,这里直接看运行结果:

可以看到,结果是24字节。
当表示ar+ 1的地址时 :

可以看到,两个地址相差12,用12 / 4 = 3,单位是元素,所以给数组加1直接就是加一行,因为一行里面有三个元素,所以求二维数组的行就变的十分直观了,例如二维数组ar,数组的总大小除以三个元素的大小(12)也就是行数,我们可以认为,一行也就是一种元素类型,所以ar数组就有两种元素类型,分别是它每一行的首元素地址,故二维数组行可以用数组的总大小除以元素类型,如图:
int row = sizeof(ar) / sizeof(ar[0]);//求二维数组的行
刚刚好,是两行。
那么列呢?
前面提到ar[0]表示为二维数组中的一行的大小,那么只需要拿到一行中一个单元格的大小然后用一行的大小除以一个的大小即可求出列的个数,如图:

刚好是三列。
作业1: 把一个二维数组的行和列的元素进行互换,存入另一个二维数组中:

我自己写的代码:
#include<stdio.h>
int main()
{
int m = 0,n =0;
printf("请您分别输入几行几列?\n");//让用户决定二维数组的大小、行和列的个数
scanf("%d%d",&m,&n);
int ar[m][n];
int br[n][m];
printf("请您填充该二维数组的元素:\n");//让用户自己填充二维数组中的大小
for(int i = 0;i < m;++i){
for(int j = 0;j < n;++j){
scanf("%d",&ar[i][j]);
}
}
printf("原始二维数组表示为:\n");//将原始的二维数组进行输出
for(int i = 0;i < m;++i){
for(int j = 0;j < n;++j){
printf("%d ",ar[i][j]);
br[j][i] = ar[i][j];//在执行这一步的时候,需要特别注意执行的过程,是数组下标的替换,例如在ar中(1,2)代表的是6,赋值给数组br的时候进行下标的替换,这是(1,2)变成了(2,1),所以将数据填充在三行两列中的最右下角的方位。
}
printf("\n");
}
printf("经过调换后的二维数组表示为:\n");//将调换后的二维数组进行输出
for(int i = 0;i < n;++i){
for(int j = 0;j < m;++j){
printf("%d ",br[i][j]);
}
printf("\n");
}
return 0;
}运行结果为:

输出完成
老师讲的代码:
#define COLUMN 3
#define ROW 2//宏定义行和列分别为2和3
#include<stdio.h>
void SwapArr(int ar[][COLUMN],int (*br)[ROW])
{
for(int i = 0;i < ROW;++i){
for(int j = 0;j < COLUMN;++j){
br[j][i] = ar[i][j];//下标赋值替换
}
printf("\n");
}
}
int main()
{
int ar[ROW][COLUMN] = {1,2,3,4,5,6};
int br[COLUMN][ROW];
SwapArr(ar,br);
for(int i = 0;i < COLUMN;++i){
for(int j = 0;j < ROW;++j){
printf("%d ",br[i][j]);
}
printf("\n");
}
}运行结果为:

输出完成
打印出如下图形:

这个图形的规律很简单,第一行和每一行的起始和末尾都是1,其余的每个数字都是前一行列不变的元素加1:
#include<stdio.h>
#include<assert.h>
const int size = 6;
void Print_Trangle(int(*ar)[size],int row,int column)
{
for(int i = 0;i < row;++i){
for(int j = 0;j <= i;++j){
if(j == 0 || j ==i){
ar[i][j] = 1;
}
else{
ar[i][j] = ar[i - 1][j] + 1;
}
}
}
}
int main()
{
int ar[size][size];
Print_Trangle(ar,size,size);
for(int i = 0;i < size;++i){
for(int j = 0;j <= i;++j){
printf("%d ",ar[i][j]);
}
printf("\n");
}
return 0;
}运行结果为:

输出完成
作业2:打印杨辉三角:
#include<stdio.h>
#include<assert.h>
const int size = 11;
void Print_Trangle(int(*ar)[size],int row,int column)
{
for(int i = 0;i < row;++i){
for(int j = 0;j <= i;++j){
if(j == 0 || j ==i){
ar[i][j] = 1;
}
else{
ar[i][j] = ar[i - 1][j] + ar[i - 1][j - 1];
}//杨辉三角的核心语句,每一个元素等于这个元素相同位置的前一行元素,加上前一行前一列元素。
}
}
}
int main()
{
int ar[size][size];
Print_Trangle(ar,size,size);
for(int i = 0;i < size;++i){
for(int j = 0;j <= i;++j){
printf("%d ",ar[i][j]);
}
printf("\n");
}
return 0;
}运行结果为:

输出完成
以上两种图形均为二维数组类型,只需要理解二维数组内元素与元素之间的关系,再将其转化为编程语言即可完成打印。
边栏推荐
- 杀死进程-查看防火墙状态
- 2021年vscode终端设置为bash模式
- Wonderful linkage | OpenMLDB Pulsar Connector principle and practical operation
- 【Meetup预告】OpenMLDB+OneFlow:链接特征工程到模型训练,加速机器学习模型开发
- js 学习进阶(事件高级 pink老师教学笔记)
- He Kaiming's new work ViTDET: target detection field, subverting the concept of layered backbone
- Node 踩坑之80端口被占用
- IIC and SPI
- Js method commonly used objects and attributes
- 【无标题】
猜你喜欢

The official website of OpenMLDB is upgraded, and the mysterious contributor map will take you to advance quickly
微信小程序云开发项目wx-store代码详解

Wonderful linkage | OpenMLDB Pulsar Connector principle and practical operation

Matplotlib找不到字体,打印乱码
![swagger错误:WARN i.s.m.p.AbstractSerializableParameter - [getExample,421] - Illegal DefaultValue null](/img/46/6ceeb330821d28b44742436da4123c.png)
swagger错误:WARN i.s.m.p.AbstractSerializableParameter - [getExample,421] - Illegal DefaultValue null

开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~

将一个excel文件中多个sheet页“拆分“成多个“独立“excel文件

gerrit configure SSH Key and account, email information

Thesis unscramble TransFG: A Transformer Architecture for Fine - grained Recognition

Open Source Machine Learning Database OpenMLDB Contributor Program Fully Launched
随机推荐
OpenMLDB Pulsar Connector: Efficiently connect real-time data to feature engineering
helm安装
贡献者任务第三期精彩来袭
Promise.race learning (judging the fastest execution of multiple promise objects)
Visual studio2019 配置使用pthread
Day 87
黑马大事件项目
编译异常解决
C语言预处理
The whole process of Tinker access --- configuration
JS案例练习(pink老师经典案例)
手把手导入企业项目(快速完成本地项目配置)
gerrit configure SSH Key and account, email information
开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~
第四范式OpenMLDB优化创新论文被国际数据库顶会VLDB录用
[Meetup] OpenMLDBxDolphinScheduler engineering and scheduling link link characteristics, building the end-to-end MLOps workflow
Js method commonly used objects and attributes
一文看懂注解与反射
父子节点数据格式不一致的树状列表实现
Manufacturer Push Platform-Huawei Access
