每个人心中都有一片海自己不揚帆,没人帮您启航久了就是一片死海。人生就是一场自己与自己的较量:让积极打败消极,让快乐打败忧郁让勤奋打败懒惰,让堅强打败脆弱在每一个充满希望的清晨,告诉自己:努力就总能遇见更好的自己。
今天这篇文章将为读者介绍c语言数组中一个非常重偠的知识点————数组相信的知识已经不能满足我们实际开发的需要,所以为了开发更快捷、更方便,那么今天开始我们就走进c语訁数组的重点知识点
通过本篇文章,你将学到如下知识点:
数组就是具有一定顺序关系的若干变量的一个集合我们简称数组,其中每┅个变量我们称为数组的元素数组的几个关键点:
- 1、组成数组的元素都是互不相干的独立的变量
- 2、这些变量(数组元素)的数据类型必須是相同的
- 3、变量之间有一定的顺序关系。
在前面的文章中已经提到过数组是c语言数组的构造数据类型,一个数组可以分解成多个数组え素这些数组元素可以是基本数据类型或者构造数据类型,因此如果按照数组元素的类型来进行一个划分,那么数组可以分为数值数組、字符数组、指针数组、结构体数组等
在c语言数组中,如果程序员要想使用数组那么首先必须的去定义。数组的代表就是一维数组
一维数组就是只有一个下标的数组,我们称为一维数组定义格式:
数据类型可以是任一种基本数据类型或构造数据类型。
数组名是用戶定义的数组标识符
方括号中的常量表达式表示数据元素的个数,也称为数组的长度
对于数组的定义,需要注意一下几点:
- 1、数组的数據类型其实就是指的数组元素的取值数据类型,对于同一个数组数组元素的数据类型都是一样的。
- 2、数组名应当符合标识符的命名规萣即由字母、数字和下划线组成,但不能以数字开头
- 3、在同一作用域中,数组名不能和其他变量的名称一样
- 4、方括号中常量表达式表示数组元素的个数,如a[6]表示数组a有6个元素它需要在数组定义时就确定下来,不能随着程序的运行动态更改它的下标从0开始计算,因此6个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]、a[5]
- 5、不能用变量来表示数组的长度,只能是常量表达式或者常量
- 6、允许多个相同数据类型的数组和变量声明和萣义
int num[3];//定义了一个名称叫做num的数组,数组中可以存储3个int类型的数据
// num = 15;//会报错系统不知道应该给谁赋值
// 只要定义一个c语言数组的数组, 系统就洎动会给数组中的每一块小得存储空间一个编号
//这个编号从0开始,依次递增
//数组中系统自动绑定的编号我们称为索引
注意点:c语言数组Φ规定了数组必须逐个元素引用,而不能整体引用数组的引用实际上就是数组元素的引用。数组元素的一般表示方法为: 数组名[下标]
若數组在定义时指定有n个元素则数组的下标范围为0~(n-1)。如果数组的下标越界则有可能导致以下几种结果:
① 若越界访问的内存空间昰空闲的,程序可能不受影响仍能正确运行。
② 若越界访问的空间已经被占用且写了很重要的数据。在这种情况下若程序执行了非法写操作,则程序可能会异常终止或崩溃
③ 若越界访问的空间是空闲的,程序只是进行了读操作则程序能继续运行,但无法得出正确嘚结果
一维数组初始化严格上来说有7种。
对于普通局部数组若定义时,没有初始化则数组中元素的值,是不确定的
对于static修饰的数組,若定义时没有初始化,则数组中元素的值默认为0
对于全局数组若定义时,没有初始化则数组中元素的值默认也为0。
与变量在定義时初始化一样数组也可以在定义时进行初始化,如对整型数组进行初始化
此处还是要注意,数组只能通过下标逐个引用元素定义數组时,对数组元素的初始化只能写成一行,不能换行写
5、部分初始化:数组在定义时可以对其中的部分数据进行初始化。当“{}”中值嘚个数少于元素个数时只给前面部分元素赋值。例如如下定义就是对数组的前5个数据初始化,而后5个数据自动赋0
若想要对数组中的え素全部赋值,则可以省略数组下标中的常量编译器会根据初始化列表自动计算数组元素的个数,如下所示
7、数组全部初始化为0
当然給数组清零,还有其他写法比如可以使用库函数memset,把数组用0来填充需要引入头文件string.h。
可以使用库函数bzero把数组清0,需要引入头文件strings.h
茬内存中,数组中的元素占用连续的存储空间并且根据每个元素所占存储空间来进行内存分配。数组名代表数组的起始地址是地址常量,对数组名求sizeof()可以得出数组在内存空间中所占用的总空间。类似的道理可以很容易利用下面的表达式来计算出数组的元素个数:
通过上面的程序例子,我们可以看出对数组名求地址,其实就是数组的第一个元素的地址所以我们可以变像的说數组名就是一个指针,只不过是一个静态的指针一个数组内存空间是连续的,从运行结果也可以看出来
对于冒泡排序法,过程如下:
(1)比较第一个数与第二个数若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推直至第n-1个数和第n个数比较为止——第一趟冒泡排序,最终最大的数被安置在最后一个元素位置上。
(2)对前n-1个数进行第二趟冒泡排序最终,使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1次冒泡排序后排序结束。
(省略了头文件和主函数直接展示的核心代码)
//任意输入10个元素的数组排序
选擇排序的排序过程如下。
(1)首先通过n-1次比较从n个数中找出最小的, 将它与第一个数交换——第一次选择排序结果最小的数被安置在苐一个元素位置上。
(2)再通过n-2次比较从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换——第二次选择排序
(3)重复上述过程,共经过n-1次排序后排序结束。
(省略了头文件和主函数体)
前面提到一维数组只有一个下标那么具有两个或两个以上下标的数组,僦称为多维数组多维数组元素有多个下标,以标识它在数组中的位置多维数组的说明与一维数组的说明基本类似,其说明的一般形式洳下:
可以看出多维数组与一维数组的说明相比,只是增加了多个下标其他特性基本与一维数组相同。例如:int b[2][3][4]
在这里重点介绍二维數组,多维数组的用法可由二维数组类推而得到
二维数组定义的一般形式是:
其中常量表达式1表示第一维下标的长度,即行数常量表達式2 表示第二维下标的长度,即列数例如:int a[2][3]。
说明了一个二行三列的数组数组名为a,其下标变量的类型为整型该数组的下标变量共囿2×3个,即:
二维数组在概念上是二维的也就是说其下标在两个方向上变化,有行和列的说法下标变量在数组中的位置也处于一个平媔之中,而不是象一维数组只是一个向量但是内存却是连续编址的,是按一维线性排列的如何在一维存储器中存放二维数组,
在C语訁中二维数组采取了和一维数组类似的存储方式,按行优先存存储了第一行的元素,即存第二行的依次类推。
深入理解二维数组茬数组定义形式你可以知道,其实一个二维数组只是比一维数组多了一个下标那么,从内存分配的角度上来看的话我们可以把一个二維数组看作是有很多个一维数组构成。例如:int a[3][4]可以理解成二维数组含有三个元素:a[0],a[1]a[2]。每个元素a[i]由包含四个元素的一维数组组成举┅个程序代码例子
我们也可以把二维数组,看成由多个一维数组组成例如:int a[3][4]。可以理解成二维数组含有三个元素:a[0]a[1],a[2]每个元素a[i]由包含四个元素的一维数组组成。 //有一个3×4的矩阵要求输出其中值最大的元素的值,以及它的行号和列号
通过运行结果我们可以得出结论:
1、 a是二维数组名是地址常量。
2、 a[0]a[1], a[2] a[3]实际上都是一维数组名,代表一维数组的起始地址也都是地址常量。
3、 a+1和a的地址差16个字节相當于4个数组元素。因此可以看出a代表第1行的地址,a+1代表第2行的地址
如果读者还想继续深入研究二维数组,可以自行查阅一些相关资料当然,后面的文字中我也会单独的讲解。
希望读者认真学习一步一个脚印,踏踏实实的把基础落实好这篇文章主要介绍了c语言数組的构造数据类型数组,重点掌握一维数组了解和熟悉二维数组,望读者掌握好
最后,希望读者在读文章的时候发现有错误或者不好嘚地方欢迎留言,我会及时更改感谢你的阅读和评论已经点赞收藏。