1.一维数组
1.1一维数组的创建:
1.2一维数组的初始化
int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";
一维数组的初始化我们要学会区分下面的代码:
char ch1[] = { 'a','b','c' };
char ch2[] = "abc";
两段代码看似是一样的,但是其实暗藏玄机。调试看看:
可以发现在内存分配的时候,ch2多了一个'\0'。所以我们可以推测输出这两个数组的情况,printf遇到'\0'才会停止,所以前一个数组会输出我们预想不到的值。
1.3一维数组使用
一维数组最常见的使用就是通过下标访问数组元素,数组下标是从0开始的。
1.4一维数组在内存中的存储
为了方便了解一维数组在内存中的存储情况,我们创建一个一维数组,打印它的地址看看:
经过观察可以发现数组每个元素的地址都是相差一个int整型大小,所以数组在内存中是连续存放的。
2.二维数组
2.1二维数组的创建
2.2二维数组的初始化
2.3二维数组的使用
二维数组同样也是通过下标来访问数组元素。
2.4二维数组在内存中的存储
打印每个元素的地址
在我们的认识里二维数组更像一个矩阵,这是逻辑上的。其实在图中我们可以发现,内存中二维数组就是连续存放的。
3.数组越界
图中数组元素只有10个,我却要打印11个元素,这样访问下标就形成了越界。编译器并没有报错,只是输出了一个随机数。
编译器没有报错并不意味这没有产生问题,我们应该自己检查数组是否发生越界。
4.练习
冒泡排序
4.1错误写法
在第一次写这个冒泡排序的时候,我把计算数组大小的sz写在了函数里,在运行代码后并没有实现我想要的排序效果,如下图:
在调试过后可以发现这样的写法sz计算出的结果是2,才导致后面的排序产生了问题。
原因是数组作为函数参数传递后,其实传递的是指针,指针类型作为存储数据地址的变量类型,其大小受计算机总线制约,而64位系统指针大小位8字节,故sizeof(指针)结果为8 ,后面的arr[0]为一个元素的大小是4,所以算出来是2。
那么就引发了困惑,数组名到底代表了什么???
数组名其实是数组首元素的地址。
有两个例外: