25. 数组作为函数参数

写代码时,我们会将数组作为参数传给函数

冒泡排序:

两两相邻的元素进行比较,可能的话进行交换

一趟冒泡排序会将一个元素放在其最后应该在的位置

10个数字只需9趟,第一趟10个数字待排序,9对比较;第二趟9个数字待排序,8对比较……

#include
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)似乎并不是地址呢?

有两个例外:

  1. sizeof(arr) 数组名表示整个数组 计算的是整个数组的大小 单位是字节
  2. &数组名 数组名表示整个数组 取出的是整个数组的地址,和数组首元素的地址虽然相同但意义不同

你可能感兴趣的:(算法,数据结构,排序算法)