自学嵌入式第十三天:指针

指针变量初始化

        使用指针时应该对指针变量进行初始化

可以初始化为  int*p = NULL

或者int*p = &a

指针是C语言的精髓,它可以在函数中实现被调修改主调这也是指针80%的功能

要实现被调修改主调    


指针作为函数参数    
    形参 指针类型变量 用来接受实参(实参是要操作的内存地址空间)
    实参 要修改谁,就要把谁的地址传过去
(个人理解为形参像是影分身,实参是本体,指针则可以直接对本体产生作用)    

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

指针 + 一维数组

类型
    int *p = a;
    int *p = &a【0】;

数组名————数组首元素地址
这个地址值的类型
 a<=>&a【0】
        a【0】 的数据类型    int型
        &a【0】地址的类型 int *
        
        int *p = a; 表示p指向了数组a

*p  <=> a[0] <=>a;

p<=>&a

指针之间的运算

& * 
p+1 跳过了 n个基类型
p-1 跳回了 n个基类型

p++ p-- 

比较> >= < <= == !=

其中 

可以 p-q 表示差了多少元素(基类型)必须是同一类型的指针

可以算(p-q)+p

不可以 p+q

下面三个等价式子体现了数组和指针密切联系

*(p+i)<=>a[i]<=>*(a+i)
 a[i]  <=> *(a+i)
 i[a]  <=> *(i+a) 

(*p是实际的值  p类似于数组的下标)

基于指针的排序和查找

其中swap为交换

void Swap(int *a,int *b)
{
    int swap = *a;

    *a = *b;
    *b = swap;
}

选择排序

void selection(int *begin, int *end)
{
    int *p =begin;
    int *q = NULL;
    for(p = begin; p < end; ++p)
    {
        for(q = p+1; q <= end ; ++q)
        {
            if(*p >*q)
                Swap(p,q);  
        }
    }                               
}

冒泡排序

void bubble(int *begin, int *end)
{
    int *p = begin;
    int *q = NULL;
    for(p = end; p > begin ; p--)
    {
        for(q = begin; q < p; q++)
        {
            if(*q > *(q + 1))
            {
                Swap(q + 1, q);   
            }
        }
    }
}

插入排序

void insertion(int *begin, int *end)
{
    int *p = begin;
    int *q = NULL;

    for(p = begin ; p <= end; ++p)
    {
        int t = *p;
        q = p;

        while (q>begin && t < *(q-1))
        {
            *q = *(q-1);
            --q;
        }                            
        *q = t;
    }
}

二分查找

int *binaryFind(int * begin ,int *end,int n
{
    int *mid = NULL;
    int *ret = NULL;
    while (begin<=end)
    {
        mid=(end - begin)/2+begin;
        if(*mid > n)
        {
            end = mid - 1;
        }
        else if(*mid < n)
        {
            begin = mid +1;
        }
        else 
        {                                  
            ret =mid;
            break;
        }
    }
    return ret;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值