1.数组的概念
在c语言中,当我们想要一次性存放一组同类型的数据,就要使用数组。
1.1数组的创建
数组是一种相同类型元素的集合
变长数组是不能初始化的!
在vscode上的运行结果
1.2数组的初始化
数组的初始化是指在创建数组的同时给数组的内容一些合理初始值(初始化)。
完全初始化:
也可以只初始化一部分数组中的元素,称为不完全初始化
不完全初始化剩余的元素默认值为0
创建数组元素全为0
错误的创建:
既不初始化数组大小,也不初始化数组中的元素
字符数组的创建
用字符串创建字符数组
这种创建方式数组中的元素会额外包含‘\0’
这种则不会
将‘b'替换成其 ASC||值 98,结果也一样
1.3一维数组的使用
数组的每一个元素都有唯一下标与之对应,下标是从0开始的。
数组元素的引用
打印数字的全部元素
倒序打印for(i=sz-1;i>=0;i--)
总结:1.数组是使用下标来访问的,而下标是从0开始的。
2.数组的大小可以通过计算得到,sz=sizeof(arr)-sizeof(arr[0])
打印出各元素的地址:printf("&arr[%d]=%p\n",i,&arr[i])
printf 函数族中对于%p一般以十六进制整数方式输出指针的值
地址间的差值也为4 ,因为这里的每一个元素占四个字节
1.4一维数组在内存中的 存储
在栈帧空间开辟过程中,是由高地址到低地址,而在数组内部内存中则是由低到高存放
2.二维数组的创建和初始化
2.1二维数组的创建
2.2二维数组的初始化
方式2:
不完全初始化,想怎么括号怎么括号,不够一行的自动用0补齐
行可以省略,列不能省略
2.3二维数组的使用
二维数组的行和列也都是从0开始的,原理与一维数组相同。
打印二维数组中的全部元素,采用嵌套循环
2.4二维数组在内存中的存储
二维数组在内存中也是连续存放的
因此一行中有几个元素是必须确定的
可以将二维数组看作一维数组的数组
3.数组越界
示例
编译器不报错,不意味着程序就是正确的
4.数组作为函数参数
将数组作为参数传递,比如要实现一个冒泡排序
冒泡排序的原理
监视中arr,10能够观察arr中的所有元素
这样的传参,传送的是地址,地址大小为4,因此函数内计算出的sz是错误的
解决办法:不在函数内计算sz,在函数外计算好sz的大小传参进去(见代码)
4.2数组名的理解
数组的地址和数组首元素的地址值上一样
&arr+1的地址跳过了整个数组,因此值上加整个数组的大小
当数组本身有一定的顺序的时候,这样的冒泡排序会重复做无用功
优化: