C语言学习记录——십일 数组(2)

目录

一、数组作为函数参数

冒泡排序

二、数组名


一、数组作为函数参数

数组也可以作为参数传给函数。

冒泡排序

冒泡排序函数将一个整形数组排序。升序

void bubble_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - 1; 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 i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;

如果sz是在函数里面定义的,那么结果不变,还是原先的排序。如果监视整个程序,发现bubble函数里sz值为1。这就是之前的数组传参问题,只传首元素地址。下面有一个十个元素的arr数组,void bubble_sort(int arr[]),上面的arr也有10个,这样就造成了浪费,所以程序自动只传第一个地址。所以没进入函数前就算好后,再带入sz的值就可以:bubble_sort(arr, sz);  那么接受时,void bubble_sort(int arr[], int sz)。

但是这个程序效率可以看到比较低,而且有限制。如果本身给了一个升序的数组,那么程序还是一样,按照步骤做,结果也确实是升序,但是程序效率太低。假如给的元素多,程序负担更重。做一些改动,在声明 j 之前:int flag = 1;  //先假设这一趟要排序的数据已经有序,然后按照程序走,交换数值,那么数组不再有序,再arr[j + 1] = tmp后写上flag = 0,其意思为本趟排序的数据其实不完全有序.当程序运行后,发现不需要交换,那么flag是1,如果交换了,那就变为0,再:

void bubble_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int flag = 1;
        int j = 0;
        for (j = 0; j < sz - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
                flag = 0;
            }
        }
        if (flag == 1)
            break;
    }
}

这样就正常了。break只能用于for和switch语句。if不是循环,用break不能结束。

二、数组名

    int arr[] = { 1,2,3,4,5,6,7 };
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    printf("%p\n", *arr);

 输出的结果相同,都输出首元素的地址,arr都代表首元素地址。数组名是数组首元素的地址,(有两个例外):

1、sizeof(数组名),单独放一个数组名时,此时表示整个数组。

2、&数组名,这时数组名代表整个数组的地址。

printf("%p\n", &arr)

printf("%p\n", &arr[0])

结果一样,但是第一个并不是出来了首元素地址。&arr只是显示出了开始的位置,数组从这开始。假如printf("%p\n", &arr + 1)

printf("%p\n", &arr[0] + 1)第二个打印出第二个元素的地址,而第一个会打印出第28个。因为数组有7个元素,每个占4个字节。

可以把%p换成%d再来看。

结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值