5、数组作为函数参数
我们这里以冒泡排序作为例子来讲:
冒泡排序默认排位升
#include <stdio.h> void bubble_sort(int arr[]) { int sz = sizeof(arr) / sizeof(arr[0]); //趟数 for (int i = 0; i < sz - 1; i++) { int flag = 1;//假设有序,每一次都置为1 //每趟的次数 for (int j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { flag = 0;//flag被执行说明是无序 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (1 == flag)//这里的判断就是在验证数组是不是顺序的,是顺序就跳出,提高了代码效率 break; } } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1 }; bubble_sort(arr); for (int i = 0; i < 9; i++) { printf("%d ", arr[i]); } return 0; }
效果展示:
我们发现这里的就没有实现排序功能呀,这是为什么呢?
我们来调试看看:
我们来想一下,传参数组名到底是什么?
但是传参后却是 1 。
我们深究一下:
int main() { int arr[10] = { 0 }; printf("%p\n", arr); printf("%p\n", arr+1); printf("%p\n", &arr[0]); printf("%p\n", &arr[0]+1); printf("%p\n", &arr); printf("%p\n", &arr+1); printf("%d\n", sizeof(arr)); return 0; }
效果展示:
我们可以看到,一二行和三四行对应相等,arr 和 &arr是一样,但是+1后完全不一样,一二行相差 4 ,五六行相差 28 不是二十八,而是十六进制中的 二八,由此我们可以看到 &arr 取出来的是整个数组地址;sizeof(arr) 也是计算整个数组。
总结:
数组名是数组首元素的地址。
但是有两个例外:
1.sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小。
2.&数组名,这里的数组名表示整个数组,取出来的是整个数组的大小。
除此之外,遇到的所有的数组名都是数组的首元素地址。
我们再回过头看那段代码
我们对那段代码进行更改:
#include <stdio.h> void bubble_sort(int* arr, int sz) { //趟数 for (int i = 0; i < sz - 1; i++) { int flag = 1;//假设有序,每一次都置为1 //每趟的次数 for (int j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { flag = 0;//flag被执行说明是无序 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (1 == flag)//这里的判断就是在验证数组是不是顺序的,是顺序就跳出,提高了代码效率 break; } } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1 }; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz); for (int i = 0; i < 9; i++) { printf("%d ", arr[i]); } return 0; }
我们分析一下 sz
效果展示:
***********************************************数组篇完结**************************************************
如果有错误请一定要指出来,谢谢大家了!
感觉写的还行留下赞和关注再走也不迟,感谢大家的支持了!!!