C语言-数组

本章重点

1. 一维数组的创建和初始化
2. 一维数组的使用
3. 一维数组在内存中的存储
4. 二维数组的创建和初始化
5. 二维数组的使用
6. 二维数组在内存中的存储
7. 数组作为函数参数
8. 数组的应用实例1:三子棋
9. 数组的应用实例2:扫雷游戏

一、一维数组的创建和初始化

1.数组的创建

数组是一组相同类型元素的集合。

数组的创建方式:9ca68fcc4fae4c17af52fad6f050e9f2.png注:数组创建, [] 中要给一个常量才可以,不能使用变量。

2.数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。 3c4c5677c46e42daa36b9ef5f93d784c.png注意

1.表示初始化

2.表示完全初始化为1~10

3.表示不完全初始化 只初始化了12345 后面五个数为00000(开辟了空间未给值就补0)

4和5表示的是同一个意思 []中什么都没写 但后面给了5个值那就表示开辟了5个空间(根据后面初始化内容来确定其个数)53223d6c439d459caf36bcd0db8e7741.png注意:

1.开辟了5个空间 “”号中自带一个\0 未初始化的就补0也就是\0

2.根据初始化内容来确定其个数 由于“”中带有一个字符\0 所以一共开辟了4个空间 有4个元素

补充:单引号与双引号的区别

“” 用于表示字符串常量。例如:“Hello, world!”,它实际上是一个以空字符 '\0' 结尾的字符数组。可以对字符串进行赋值、传递给函数等操作。

‘’用于表示单个字符常量。例如:‘A’、‘b’等。单个字符常量在内存中通常占用一个字节的存储空间。

二、一维数组的使用

对于数组的使用我们介绍一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符3baf553d202947bfabf9f52cd3139b93.png问题:这里的arr[i]=i;是什么意思呢?

解释:这里表示将数组 arr 下标为 i 的元素赋值为 i 的值         例如:如果 arr 是一个整型数组,当 i = 3 时,就把数组 arr 的第 4 个(因为数组下标从 0 开始)元素的值设为 3

总结 :
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。  int arr[10];
                                            int sz = sizeof(arr) / sizeof(arr[0]);
这里  sizeof(arr) 得到整个数组占用的字节数, sizeof(arr[0])得到数组中单个元素占用的字节数,两者相除就得到数组的大小。

三、 一维数组在内存中的存储

5c138f89d2d9462b8adf031228f821ba.png问题:红色批注那里是什么意思?

解答:

  1. “arr [% d]” 部分:这里的 “% d” 表示一个整数占位符,在输出时会被变量 i 的值替换。所以 “arr [% d]” 最终会显示为 “arr [具体的下标值]”,比如 “arr [3]”。
  2. “&arr [i]” 部分:这是取数组 arr 中下标为 i 的元素的地址
仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。 由此可以得

出结论:一维数组在内存中是连续存放的。

              随着数组下标的增长,地址是由低到高变化的。71e7aa3dd7bb43d48b05d9d1664b70b2.pngc286c5219c4840af8ed50c3c9649baca.png

四、二维数组的创建和初始化

1.二维数组的创建

e52f8b0d5dfa4ef7b11e4901040c5892.png

2.二维数组的初始化

完全初始化: 

a93b32bdd1e94fccb3d86b1966e87093.png

不完全初始化:(后面补0)7045bee879ca4ec186990573ce6f85ef.png

下面这张图表示:第一行为1 2;第二行为3 4 ;第三行为 5 6;

dac18bd0c2ce456a81529e94e36d4818.png注意:行数可以不写(也就是图中的【3】)因为它可以根据后面有几个小{}来确定  但是列数必须写!!!(原因如下)

编译器知道每一行有 4 个int类型的元素(通常int类型占用 4 个字节),那么它可以计算出整个二维数组所需的内存空间为 3 * 4 * 4 = 48 字节。如果不知道列数,编译器就无法确定每一行的长度,也就无法准确地分配内存空间

五、二维数组的使用

二维数组的使用也是通过下标的方式。 看代码: cd0c7449cc0b4418bfabd85a56754757.png注意:此图为我们想象中的排列(实际的排列见下图) 6d00e9b80a394cf299dc1c41b4c2af08.png注意:这里的这个for循环表示的是先打印每行里面的0 1 2 3列(也就是一行一行打)

六、二维数组在内存中的存储

像一维数组一样,这里我们尝试打印二维数组的每个元素。 76b243e2dd34436baee949aad470b4ea.png通过结果我们可以分析到,其实 二维数组在内存中也是连续存储的。(相邻位置都相差4)
一行内部联系,跨行也是连续的。
注意:易错点 %p取的是地址 因此写的时候不要忘记取地址符号&
0ba4ec620c7148d9b843ed123cf592d4.png注意:此图为实际的排列 30a3102cbd5d47c0bdd86048c7ff3114.png

补充:二维数组与一维数组的关系

七、数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。 那我们将会这样使用该函数:

1.冒泡排序函数的错误设计(排序 将降序排为升序)518b2d3d7f954c5495799918e058a288.png2b91e8195b6949dd821cbb8c904a8e86.png

注意:为什么是sz-1-i呢  因为这样就不会写成固定的 当i=1时就变成了八趟

注意看调试过程中sz为1 但实际sz应该为10那说明有错误 说明我们在设计函数时有错误 我们只能在外部求好后拿进来 而不是指望它在内部算

问题:为什么sz传过去是1呢 不应该是10 吗?

解答:因为下面那个bubble_sort(arr);这里的arr传的是首元素的地址 它不满足下面的两个特例 所以传过去的为1而不是10

改写后:7eabe16adce846eeb98c742b61d3ac87.png

按fn+f10进行调试即可变成升序c3dcb2dad5ac422e96f27d5a42683459.png

要打印这样:f8b1894a6f78428bafaa266fc84fa5de.png

什么是冒泡函数?冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这里 sizeof(arr) 得到整个数组占用的字节数sizeof(arr[0])得到数组中单个元素占用的字节数,两者相除就得到数组的大小。

详解:首先“bubble_sort” 即 “冒泡排序”。它是一种计算机科学领域中较为简单的排序算法,属于交换排序。后面()里面arr表示首元素地址 sz表示元素个数 所以我们由sz可知后端位置为arr+sz-1;从而知道整个数组的范围,两端位置知道了就可以用冒泡函数了;然后要进行函数的调用去调用这个冒泡函数 于是将实参arr 和sz的形参写出来则为最上面int arr[](arr [] 表示指向数组首元素地址的指针)和int sz 这里定义变量名(sz)是为了更好的找到传过来的参数 ;接着利用大循环带动小循环的思路首先要确定好大循环的趟数为9趟(9趟是因为有10个数字9 8 7 6 5 4 3 2 1 0  数字9升序到最右端为1趟 数字8升序到右端倒数第二个位置为第二趟.....依次类推到1和0互换位置一共9趟 这就是大循环 注意:sz=10 所以sz-1=9 小于9是因为i从0开始 )其次确定好小循环(一趟里面走几次 次数的次数为第一趟里面要比较9次 第二趟比较8次 第三趟比较7次......比到第八趟位置互换就行 由此规律可看出里面小循环的次数变化为sz-1-i(这里为什么要-i呢 是因为里面的次数要和外面的趟数挂钩 sz-1表示最大趟数为9  -i是比如i=0时那就比较9次 i=1时比较8次.....  因为j=0 所以arr[j]表示第一个元素 与第二个元素arr[j+1]比较 然后j++依次比较 进行交换位置 用三个杯子原理)最后通过for循环遍历出整个数组( 注意这里的i与上面那个i不一样噢 记住:函数里面的变量出了这个函数就销毁了 所以上面i出了那个冒泡函数就销毁了 这里的i是重新定义的)进行打印arr[i]表示的是当i=0时打印的第一个元素.....依次类推到打印第九个元素也就是i=8.

2.数组名是什么?

结论:
数组名是数组首元素的地址。 (有两个例外) 14c0ee2e61704620a4e16ebf8eec76a9.png注意: %p是一个格式说明符,用于输出指针(地址)值。 如果数组名是首元素地址,那么:

例外1:

sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组 665a6c9e080d4e06ac576cb90d2bfa96.png问题:为什么输出的结果是:40?而不是4?
解答:因为表示整个数组 一共有10个元素 一个元素占4个字节则为40 ;表示首元素则为4

例外2:

&(数组名),取出的是数组的地址。&数组名,数组名表示整个数组。 aac874e753934106ac059a5e9ab0198c.png注意:这里的序号1为整个地址 2 3表示上面的取首元素地址 那为什么输出的结果是一样的呢?
解答:虽然结果是一样的 但是表示的意义不一样 
为了更好区分 见下图: 11d0f805c142454ca14f9ad46341a32a.png从图中可以看出:整个数组+1加了40;二首元素+1加了4
问题:十六进制转换是如何转换相差40的呢? 
解答: 7ec36fa6569843ac9240cc4ec9779ee4.png

八、数组的应用实例1:三子棋

(分3个文件来完成 不要用一个为件完成)

九、数组的应用实例2:扫雷游戏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值