C语言二维数组超细讲解
用一维数组处理二维表格,实际是可行的,但是会很复杂,特别是遇到二维表格的输入、处理和输出。
在你绞尽脑汁的时候,二维数组(一维数组的大哥)像电视剧里救美的英雄一样显现在你的面前,初识数组的朋友们还等什么呢?让我们认识一下这位武功高强的大哥吧!
1. 双下标变量
聪明的你一定能够顾名思义了吧,简单举个例子:Array [2] [3]
Array 是数组名,后面的两个方括号内分别放行下标和列下标,这里的行下标和列下标就是所谓的双下标。
这里的下标规则和一维数组的下标规则一模一样:
(1)可以是正的整形变量:
eg:Array [2] [3];
(2)可以是字符常量:
eg:Array [‘A’] [‘B’] = Array [65] [66];(不清楚字符常量的同学可以点击:
(3)可以是有确定值的表达式:
eg:Array [i+1] [j+2]、Array [ A[1] ] [ A[2] ];
总而言之,这里的下标分别表示行数和列数。
接下来和小编一起感受一下双下标变量的威力。
上下标变量可以使方程组的计算更简单,比如:
计算一个二元一次线性方程组:
$$\left\{\begin{matrix}7*x_{1}-4*x_{2}=7\\-2*x_{1}+3*x_{2}=-1\end{matrix}\right.$$
它的一般表达式为:
$$\left\{\begin{matrix}a11*x1+a12*x2=b1\\a21*x1+a22*x2=b2\end{matrix}\right.$$
我们可以写出一个该方程组的增广矩阵:
$$\begin{pmatrix}a11& a12& b1\\a21& a22& b2\end{pmatrix}$$
运用克拉默法则可得:
$$x1=(b1*a22-b2*a12)/(a11*a22-a21*a12)$$
$$x2=(a11*b2-a21*b1)/(a11*a22-a21*a12)$$
因为矩阵的本质其实就是二维数表,我们可以用二维数组来表示这个方程组的系数。
我们先定义一个二维数表:a[2][2],和一个一维数表:b[2]
那么a11可以写成:a[0][0],a12可以写成 a[0][1],a21,a22同理。则:
$$x1=(b[0]*a[1][1]-b[1]*a[0][1])/(a[0][0]*a[1][1]-a[1][0]*a[0][1])$$
x2道理一样。
所以,通过双下标变量,我们只需要为a[i][j],b[i]中的元素赋值,便可以轻松解决方程组的问题。
另外,通过双下标变量来表示一张二维数表,使下标变量的行列下标正好与数据在表格中的位置相对应,形象直观地反映了二维表格。
2. 二维数组定义
很简单,由双下标变量定义的数组就称为二维数组,双下标变量就是数组的元素。
二维数组定义的一般形式和一维数组大同小异,只是下表中的常量表达式多了一个(维度加一):
<类型标识符> <数组名标识符> [<常量表达式>] [<常量表达式>]
例如:float a [3] [4],b [5] [6];
这里的float表示二维数组中元素的类型是单精度浮点型,a、b就是给数组取的名字。
注意:a [3] [4] 千万千万不要写成 a [3 , 4] !
上面我们把二维数组理解成二维图表,我们也可以将二维数组看成元素是一维数组的一维数组,将维数降低。
比如 a [3] [4],我们可以把a看成一个一维数组,里面有三个元素:a [0]、a [1]、a[2],每个元素又包含4个元素:
| a [0] | a [0] [1] | a [0] [2] | a [0] [3] | a [0] [4] |
| a [1] | a [1] [1] | a [1] [2] | a [1] [3] | a [1] [4] |
| a [2] | a [2] [1] | a [2] [2] | a [2] [3] | a [2] [4] |
这种理解方法在数据初始化和用指针表示时显得很方便。
在C语言中,二维数组中元素排列的顺序是按行存放的,就是说先排列第一行的数据,再排列下第二行的数据,以此类推。如图:

数组元素可以出现在表达式中也可以被赋值,例如:b [1] [2] = a [1] [3] / 2。
小编在这里想提醒一下:要严格区分定义数组时用的 a [5] [6] 和引用元素时的 a [5] [6] 的区别哦!
3. 二维数组的初始化
对二维数组的初始化有一下几种办法:
(1)分行给二维数组赋值
这个方法用到了我们前面讲的对二维数组的降维理解,比如:
int a [2] [3] = {{1, 2, 3}, {4, 5, 6}};
此语句先将第一行元素依次赋值为:1、2、3,然后将第二行元素赋值为:4、5、6,因此说是按行赋值。
(2) 可以只有一个花括号,按二维数组元素的排列顺序对各元素依次赋值
比如:
int a [2] [3] = {1, 2, 3, 4, 5, 6};
(3)对部分元素赋初值
①
int a [2] [3] = {{2}, {4}};
此语句表示只给第一行第一个元素赋值为2,第二行第一个元素赋值为4,而其他元素都为0。
②
int a [2] [3] = {{1, 2, 3}};
此语句表示只给第一行三个元素分别赋值为:1、2、3。
③
int a [2] [3] = {{},{1, 2, 3}};
此语句表示只给第二行三个元素分别赋值为:1、2、3。
(4)定义数组时对第一维的长度可以不定义,但必须定义第二维的长度
例:
int a [] [3] = {1, 2, 3, 4, 5, 6};
系统会根据输入的总个数分配存储空间,易知这个二维数组有二行;
再如:

有关二维数组的知识就讲到这里啦,欢迎小伙伴来交流哦!
预告:二维数组的应用
2020-04-21
17:26:54
C语言二维数组超细讲解的更多相关文章
- c语言二维数组传递
c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...
- C语言字符数组超细讲解
看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩? 哈哈,确实,一起来认识一下这朵数组界的奇葩吧! 一.字符数组的定义.引用.初始化 大家好!我是字符数组,看我的 ...
- C语言二维数组
上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为一维数组.在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以确定它在数组中的位置.本节只介绍二维数 ...
- 关于c语言二维数组与指针的个人理解及处理办法。
相信大家在学习C语言时,对一维数组和指针的理解应该是自信的,但是,我在学习过程中,看到网上一些博文,发现即便是参加工作的一些专业编程人员,突然碰到二维数组和指针的问题时,也可能会遇到难以处理的诡异问题 ...
- C语言 二维数组复制、清零及打印显示
#include <stdlib.h> #include <stdio.h> #include <string.h> //二维整型数组打印显示 ],int row, ...
- C语言二维数组作业
一.PTA实验作业 题目1:7-3 出生年 1. 本题PTA提交列表 2. 设计思路 1.声明一个函数different()用来计算一个年份的不同数字个数 2.定义y(y是来计算符合要求的年份的量), ...
- C语言 二维数组(指针)动态分配和释放(转)
C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按 ...
- C语言二维数组作为函数参数
设有整型二维数组a[3][4]如下:0 1 2 34 5 6 78 9 10 11 它的定义为: int a[3][4]={{0,1,2,3},{4,5,6,7} ...
- C语言二维数组作为函数的参数
前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...
随机推荐
- 《JavaScript 模式》读书笔记(5)— 对象创建模式2
这一篇,我们主要来学习一下私有属性和方法以及模块模式. 三.私有属性和方法 JavaScript并没有特殊的语法来表示私有.保护.或公共属性和方法,在这一点上与Java或其他语言是不同的.JavaSc ...
- Excel知识点与技巧1
1.工作区:方便两个工作表之间进行对比 2.工作表标签颜色 3.交换两列的次序 4.快速到达边界:即快速到达第一行或最后一行 5.冻结窗格:可以固定某几行或某几列一直存在于窗口,不会随着往下拉或往右拉 ...
- layer弹层插件
// 使用前需要引入jquery的支持,链接如下: https://blog-static.cnblogs.com/files/liguanlong/jquery1.9.1.min.js ...
- 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(四)
作者:Geppetto 前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,介绍了PSO在FS中的重要性和一些常用的方法.FS与离散化的背景,介绍了EPSO与PPS ...
- Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序
Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子 上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...
- java NIO理解分析与基本使用
我前段时间的一篇博客java网络编程--多线程数据收发并行总结了服务端与客户端之间的收发并行实践.原理很简单,就是针对单一客户端,服务端起两个线程分别负责read和write操作,然后线程保持阻塞等待 ...
- Java的浅拷贝与深拷贝总结
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- 【故障公告】部署在 k8s 上的博客后台昨天与今天在访问高峰多次出现 502
非常抱歉,从昨天上午开始,部署在 k8s 集群上的博客后台(基于 .NET Core 3.1 + Angular 8.2 实现)出现奇怪问题,一到访问高峰就多次出现 502 ,有时能自动恢复,有时需要 ...
- PTA数据结构与算法题目集(中文) 7-4
PTA数据结构与算法题目集(中文) 7-4 是否同一颗二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, ...
- awk扩展应用
awk扩展应用 案例1:使用awk提取文本 案例2:aw ...