数组的创建和使用以及存储
目录
1.一维数组的创建和初始化
2.二维数组的创建和初始化
3数组越界
4.数组作为函数参数
5.数据实例:
1.一维数组的创建和初始化
2.一维数组的使用
3.一维数组在内存中的存储
4.二维数组的创建和初始化
5.二维数组的使用
6.二维数组在内存中的存储
7.数组越界
8.数组作为函数参数
9.数组的应用实例1:三子棋
10.数组的应用实例2:扫雷游戏
1.一维数组的创建和初始化
1.1数组的创建
数组是一组相同类型元素的集合。
数组的创建方式:
type arr_name [cont]; //type 是数组的元素类型 //const 是一个常量表达式,用来指定数组的大小

数组创建的实例:
//代码1: int arr1[10];//代码2 int coun_t = 10; int arr2[coun_t];//数组可以正常创建吗?//代码3 char arr3[10]; float arr4[1]; double arr5[20];
注:数组创建,在C99标准之前,[]中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。
1.2数组的创建
二维数组的sizeof用法

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始化值(初始化)。列:


数组在创建的时候如果想不指定数组确定的大小就得初始化。数组的元素个数根据初始化的内容来确定
但是对于下面的代码要区分,内存中如何分配的。

在打印字符的时候遇到\0才会停止,第一种在内存中后面会默认隐藏存放一个\0,而第二种没有,所以会打印一些字符烫烫烫烫,要分清楚双引号引起的字符和单引号引起的字符
1.3一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[],下标引用操作符。它其实就是数组访问的操作符。

在访问数组的时候它们的下标也是从零开始

总结:
1.数组是使用下标来访问的,下标是从零开始。
2.数组的大小可以通过计算得到。

注:求一个数组的元素个数可以通过sizeof计算整个数组的类型大小再除以sizeof计算单个元素类型的大小就能得到整个数组的所有元素。
1.4一维数组在内存中的存储
接下来查看数组在内存中的存放

我们也可以通过指针来访问,因为指针是用来保存地址的,只要知道了第一个地址就可以顺藤摸瓜找到它后面的所有元素的地址,可以对比一下



以此得出结论数组在内存中是连续存放的
2.二维数组的创建和初始化
2.1二维数组的创建
二维数组就是多行多列。
//数组创建 int arr[3][4]; char arr[3][4]; double arr[2][3]
比如这个样子

2.2二维数组的初始化

2.3二维数组的使用
二维数组也是通过下标的方式来访问

2.4二维数组在内存中的存储


假象中是多行多列,实际上是连续存放的
二维数组在内存中也是连续存放的,既然是连续存放的我们能不能把二维数组看成一维数组?

通过结果我们可以分析到,其实二维数组在内存中也是连续存储的。

我们可以理解成二维数组也是一维数组的数组
3数组越界
数组的下标是有范围限制的。
数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。
所以程序员写代码时,最好自己做越界的检查。

当i = 10的时候越界访问了,访问了不属于他开辟的空间,但是编译器不一定会报错
同理二维数组的行和列也可能存在越界访问。
4.数组作为函数参数
往往我们写代码的时候,会将数组作为参数传给函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数。
将一个整形数组排序。
4.1冒泡排序函数的错误设计

arr是数组代表的是首元素地址,这里传过去的只有一个元素,所以这里sizeof无法求出整个数组的大小

小技巧:如果要观察形参数组的元素个数在中间加个,后面加个10

4.2数组名是什么


4.3冒泡排序函数的正确设计


数组传参,传的是数组首元素地址,形参可以写成数组,也可以写成指针,即使形参写成数组,本质上也是指针。

5.数据实例:
5.1数组的应用实例1:三子棋
已发布
5.2数组的应用实例2:扫雷
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
