深入理解指针(7)

        上篇我们讲到了数组名的理解和使用指针访问数组的方法,本篇我们继续往下讲:

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函数进行交换对比后顺序正确的数组。这样子整个排序的过程就都完成了。而之所以称为冒泡函数,是因为整个运行过程就像是吹泡泡一样,大的在下面小的在上面。

        这就是本篇要讲的所有内容了,希望其中的知识能够让你有所收获,我们下篇见。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值