上篇我们讲到了数组名的理解和使用指针访问数组的方法,本篇我们继续往下讲:
1.一维数组传参的本质
我们可以从两段代码看到其中的不同之处,一个sz的大小计算是在main函数内进行的,另一个sz的大小是在形参部分进行的,也可以从右侧运行结果看到有不同之处。这里就要涉及到一个知识点:形参是实参的临时拷贝。因为从main函数传参的时候,传的是arr(数组名),而数组名又是数组首元素的地址,因此sz = sizeof(arr)/sizeof(arr[ 0 ])实际上是sz = 4 / 4 = 1 ,所以形参部分的sz计算才会是1,而sz=1的情况下,for循环的i < sz 只循环了一遍就不满足条件了。
除此之外数组传参还有一个小细节,可以看到print函数部分的(int arr [ 10 ]),其实在数组传参的时候,形参是可以写成数组形式的,但是本质上还是一个指针变量而不是数组。因为如果把打印部分printf的arr[ i ]换成* ( p + i )结果也是一1样的。
结论:一维数组传参,形参的部分可以写成数组的形式也可以写成指针的形式
2.冒泡排序
冒泡排序是用于解决排序问题,存在很多数据要进行排序时候会用到冒泡排序,而冒泡排序的核心思想是:两两相邻的元素进行比较。这里我先举个排序的例子:
代码有点长度,不过可以逐个拆解分析,首先是最简单的arr数组初始化,因为我举的例子是属于排序中的升序,所以初始化时是从9~1开始的(方便分析)。然后就是常见的数组元素个数的计算,接着就是重点了。
bubble_sort函数是用于计算排序的函数,里面使用了嵌套循环和判断语句,外层的for循环是根据趟数来决定要不要往下走,目的是防止在所有的元素对比后排序完毕了还在进行运算。至于内层的for循环是用于控制元素之间的对比,当j < sz -1的时候进入循环,循环内就是if语句的内容:当j > j + 1的时候,两个元素进行交换。然后再进行下一个对比如此循环往复,直到把所有元素都对比一遍。
而这里i和if语句的作用在于,如果你碰到的数组是一个接近排序完成的数组,他就可以减少运算量不需要一直运算在不该排序的地方。比如说你现在需要排序的数组是{ 1,2,5,4,3,6,7,9,8,10},他就可以把已经排序正确的进行忽略不用运算。这样就减少了程序的运算量。
然后就是中间的print_arr函数,这是自定义函数,是用于打印bubble_sort函数进行交换对比后顺序正确的数组。这样子整个排序的过程就都完成了。而之所以称为冒泡函数,是因为整个运行过程就像是吹泡泡一样,大的在下面小的在上面。
这就是本篇要讲的所有内容了,希望其中的知识能够让你有所收获,我们下篇见。