写代码时,我们会将数组作为参数传给函数
冒泡排序:
两两相邻的元素进行比较,可能的话进行交换
一趟冒泡排序会将一个元素放在其最后应该在的位置
10个数字只需9趟,第一趟10个数字待排序,9对比较;第二趟9个数字待排序,8对比较……
#include<stdio.h>
void bubble_sort(int arr[], int sz) //形参arr的本质是指针
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
//一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
//交换
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//排序为升序
//确定趟数
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz); //数组在传参时,传递的是首元素的数组
return 0;
}
注意,这里的确定趟数不能放在函数中去计算。因为数组传参时是将首元素的地址传过去,而不是将整个数组传过去,自然在函数中求不出具体个数。
数组名
数组名是数组首元素的地址
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr[0]);
打印出来的结果是相同的,所以的确是数组首元素的地址。
但为什么在计算数组长度时,sizeof(arr)似乎并不是地址呢?
有两个例外:
- sizeof(arr) 数组名表示整个数组 计算的是整个数组的大小 单位是字节
- &数组名 数组名表示整个数组 取出的是整个数组的地址,和数组首元素的地址虽然相同但意义不同