各位CSDN的uu们你们好呀,今天小雅兰考试了呀,考的是计算机基础,希望不大……不过这些都不是问题,这不能阻止我对C语言的热情,那现在,就让我们进入冒泡排序的世界吧,我在写数组这篇博客的时候就说过,会把冒泡排序单独拎出来讲,今天总算是要兑现这个承诺啦

往往我们在写代码的时候,会将数组作为参数传个函数。

比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。

这里首先给出一个乱序数组

int arr[]={3,1,7,5,8,9,0,2,4,6};

排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小

冒泡排序是两两相邻的元素进行比较(这里我们来看升序)

这个就是小雅兰写的冒泡排序的过程啦,十个元素需要比较九次

那我们来写代码吧

我们首先肯定会这样来写

#define _CRT_SECURE_NO_WARNINGS 1#includevoid bubble_sort(int arr[]){int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0; i < sz; i++)//冒泡排序的趟数{int j = 0;for (j = 0; j  arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}int main(){int arr[] = { 3,1,7,5,8,9,0,2,4,6 };bubble_sort(arr);//是否可以正常排序呢?int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;}

这可就奇了怪了,最后排序后的数组怎么是这样一个运行结果呢?这还是一个乱序数组啊,没有达到我们的预期。我们来看看究竟是怎么回事。

然后,我们就要引出我们的知识点啦

#includeint main(){   int arr[10]={1,2,3,4,5};   printf("%p\n",arr);   printf("%p\n",&arr[0]);   printf("%d\n",*arr);   return 0;}

我们可以发现:数组名的地址和数组首元素的地址打印出来竟然一模一样

由此我们得知:数组名是数组首元素的地址。

但是,并不是在任何情况下,数组名都是数组首元素的地址

int arr[10]={0};printf("%d\n",sizeof(arr));

我们来运行一下,发现了不同

这个打印结果竟然是40诶

如果真是在任何情况下,数组名都是首元素的地址,那么,我们这串代码的打印结果应该是4才对啊

原来是有特殊情况的

补充:

1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。

2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。

所以,我们上面的那个冒泡排序函数些的是非常错误的。

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。

所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。

那么,函数内部的 sizeof(arr) 结果是4。

所以,正确的冒泡排序函数该怎么写呢?

#includevoid bubble_sort(int arr[],int sz){int i = 0;for (i = 0; i < sz; i++)//冒泡排序的趟数{int j = 0;for (j = 0; j  arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}int main(){int arr[] = { 3,1,7,5,8,9,0,2,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr,sz);//是否可以正常排序呢?int i = 0;for (i = 0; i <sz; i++){printf("%d ", arr[i]);}return 0;}

这样子就非常完美啦


好啦,小雅兰今天的内容就到这里了,总算是把数组的收尾工作讲明白了,那么数组的所有知识点就告一段落了,接下来请期待小雅兰的操作符的博客噢,这段时间还是比较忙,明天上午考英语加油呀!!!(害,小雅兰的听力和口语真的好差,有点难过)