本章重点
一、一维数组的创建和初始化
1.数组的创建
数组是一组相同类型元素的集合。
数组的创建方式:注:数组创建, [] 中要给一个常量才可以,不能使用变量。
2.数组的初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。 注意:
1.表示初始化
2.表示完全初始化为1~10
3.表示不完全初始化 只初始化了12345 后面五个数为00000(开辟了空间未给值就补0)
4和5表示的是同一个意思 []中什么都没写 但后面给了5个值那就表示开辟了5个空间(根据后面初始化内容来确定其个数)注意:
1.开辟了5个空间 “”号中自带一个\0 未初始化的就补0也就是\0
2.根据初始化内容来确定其个数 由于“”中带有一个字符\0 所以一共开辟了4个空间 有4个元素
补充:单引号与双引号的区别
“” 用于表示字符串常量。例如:“Hello, world!”,它实际上是一个以空字符 '\0' 结尾的字符数组。可以对字符串进行赋值、传递给函数等操作。
‘’用于表示单个字符常量。例如:‘A’、‘b’等。单个字符常量在内存中通常占用一个字节的存储空间。
二、一维数组的使用
对于数组的使用我们介绍一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符问题:这里的arr[i]=i;是什么意思呢?
解释:这里表示将数组 arr
下标为 i
的元素赋值为 i
的值 例如:如果 arr
是一个整型数组,当 i = 3
时,就把数组 arr
的第 4 个(因为数组下标从 0 开始)元素的值设为 3
sizeof(arr)
得到整个数组占用的字节数,
sizeof(arr[0])
得到数组中单个元素占用的字节数,两者相除就得到数组的大小。
三、 一维数组在内存中的存储
问题:红色批注那里是什么意思?
解答:
- “arr [% d]” 部分:这里的 “% d” 表示一个整数占位符,在输出时会被变量
i
的值替换。所以 “arr [% d]” 最终会显示为 “arr [具体的下标值]”,比如 “arr [3]”。 - “&arr [i]” 部分:这是取数组
arr
中下标为i
的元素的地址。
出结论:一维数组在内存中是连续存放的。
随着数组下标的增长,地址是由低到高变化的。
四、二维数组的创建和初始化
1.二维数组的创建
2.二维数组的初始化
完全初始化:
不完全初始化:(后面补0)
下面这张图表示:第一行为1 2;第二行为3 4 ;第三行为 5 6;
注意:行数可以不写(也就是图中的【3】)因为它可以根据后面有几个小{}来确定 但是列数必须写!!!(原因如下)
编译器知道每一行有 4 个int
类型的元素(通常int
类型占用 4 个字节),那么它可以计算出整个二维数组所需的内存空间为 3 * 4 * 4 = 48 字节。如果不知道列数,编译器就无法确定每一行的长度,也就无法准确地分配内存空间。
五、二维数组的使用
六、二维数组在内存中的存储
补充:二维数组与一维数组的关系
七、数组作为函数参数
1.冒泡排序函数的错误设计(排序 将降序排为升序)
注意:为什么是sz-1-i呢 因为这样就不会写成固定的 当i=1时就变成了八趟
注意看调试过程中sz为1 但实际sz应该为10那说明有错误 说明我们在设计函数时有错误 我们只能在外部求好后拿进来 而不是指望它在内部算
问题:为什么sz传过去是1呢 不应该是10 吗?
解答:因为下面那个bubble_sort(arr);这里的arr传的是首元素的地址 它不满足下面的两个特例 所以传过去的为1而不是10
改写后:
按fn+f10进行调试即可变成升序
要打印这样:
什么是冒泡函数?冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这里 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.数组名是什么?
%p
是一个格式说明符,用于输出指针(地址)值。
如果数组名是首元素地址,那么:
例外1:
例外2:
八、数组的应用实例1:三子棋
(分3个文件来完成 不要用一个为件完成)