自学嵌入式第十三天C语言篇12

目录

指针

        指针变量的初始化

指针作为函数的参数

指针操作数组

        指针+一维整型数组                

                迭代操作

                快速排序


 

指针

        指针变量的初始化

                如果指针变量没有初始化,此时是随机值。---> 野指针

                初始化可以让指针变量有明确指向

int *p;

int *p = NULL;    //    NULL为0号地址  简称空指针

        赋值

int a = 10;

int *p;

p = &a;


//定义多个指针类型变量时有多少个指针,就写多少个*
int *p,q;        //此时p是指针类型,q是int类型

int *p,*q;       //此时p和q是指针类型

指针的作用

        被调修改主调 

指针作为函数的参数

        形参:是指针类型的变量,用来接收实参(实参是要操作的内存空间的地址)

        实参:要修改谁,就把谁的地址传过去。要保证地址有效,不能是野指针。

                注意:被调函数中一定要有*p运算(间接访问的操作)

#include <stdio.h>

int addOne(int *p)
{
    *p = *p + 1;
        
    return *p
}

int main()
{
    int n = 1;

    int ret = addOne(&n);

    printf("n = %d\n",n);

    return 0;
}

指针操作数组

        指针+一维整型数组                

int a[5];    //数组名代表数据类型和数组首元素的地址

int *p = a;

int *p = &a[0];

                1.定义一个什么类型的指针变量?——int *类型

                2.谁能代表数组所在空间的首地址?—— 数组名

                        这个地址值的类型        a <=> &a[0]; a[0]的数据类型为int型,所以&a[0]是int *类型

                补充:指针相关的运算:&        *        p+1        p-1        p++        p--        比较运算。 

                        p + n表示跳过了n个基类型;

                        p - n表示回退了n个基类型; 

                        两个指针也可以做减法,表示两个指针差多少个元素(基类型),前提是两个指针是同一类型的指针。但是一定不能做加法

                形参:指针类型的变量+数组长度

                实参:传数组名(数组的首地址)+ 数组长度

                迭代操作

                         传参时不传入数组长度,而是传入结束的地址。

//举例:找到一个一维数组中的最大值

#include <stdio.h>

int findMax(int *begin,int *end)
{
    int max = *begin;

    while (begin < end)
    {
        if (*begin > max)
        {
            max = *begin;
        }
        begin++;
    }

    return; 
}

int main()
{
    int a[] = {1,3,6,9,1,2};
    int len = sizeof(a) / sizeof(a[0]);

    int max = findMax(a,a+len-1);

    printf("max = %d\n",max);
    
    return 0;
}
                快速排序

                        1.将数组第一个元素作为基准点

                        2.从数组结束位置往回找,找到第一个比基准点的值还小的数记住位置

                        3.从数组开头往后找,找到第一个比基准点大的数 ,记录位置

                        4.将两个位置上的数进行交换,然后进行下一次1-4的步骤

                        5.当两头相向而行时遇到一起时,记录遇到的位置,将基准点上的值与该位置上的值交换。

                        6.此时将数组分为三个部分,前半区,第一轮完成后begin和end相遇的地方,后半区

                        7.调用函数分别对前半区和后半区进行1-5的步骤,直到开始和结束位置错开。

void quickSort(int *begin,int *end)
{
    int *p = begin;    //记录刚开始时的开始位置
    int *q = end;      //记录开始时的结束位置    //这两个位置为前后半区分别提供了开始和结束位置
    int *mark = begin;    //将第一个位置做基准点

    if (begin >= end)
    {
        return;        //刚开始begin和end就错开,直接结束排序
    }

    while (begin < end)    //找到begin和end相遇的位置
    {
        while (begin < end && *end > *mark)    //如果没从后面找到一个比基准点小的值,则一致向前找
        {
            end--;
        }
        
        while (begin < end && *begin < *mark)    //如果没从前面找到一个比基准点大的值,则一致向后找
        {
            begin++;
        }

        swap(begin,end);    //从前面找到一个比基准点的值大的位置,从后面找到一个比基准点的值小的位置,交换两个位置的值。
    }

    swap(mark,begin);    //begin和end相遇,表示找到一个位置,前面都比他小,都比他大,交换这个位置。

    quickSort(p,end-1);    //对前半区进行快速排序,开始位置为第一个,结束位置是从begin和end相遇位置的前一个。
    quickSort(begin+1,q);    //对后半区进行快速排序,开始位置为begin和end相遇位置的后一个,结束位置为最后一个

}

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值