学习嵌入式第十二天——C语言——指针

认识指针

概念

(1).指针概念
  指针 就是 地址 
  地址 就是 内存单元的编号 
  代表的意义:
    地址 只是 告诉了说 在哪里
 (2).指针类型 
  地址 本身 是一种特殊的数据 --- 是具有指向含义的 整数 
  c语言为了能够表示这种特殊的数据 
  专门设计一种数据类型 --- 指针类型

定义

语法:
    基类型  *  指针变量名;

(1)基类型    
        基类型说明了 通过指针 找到的空间
        a.多大
        b.怎么用
        就是 指针找到的空间上 所存储的 数据类型 
(2) *    
       只是一个修饰符 
       用来说明现在定义的变量,不是普通变量,而是指针变量 
(3)指针变量名
       是个标识符 ,符合标识符命名规则 

定义多个指针变量:
int *p1,*p2,*p3; //*用来修饰变量名 

理解

指针就是地址,地址就是内存单元的编号,通过指针能且仅能 找到该地址对应的空间

指针是一种数据类型,这种类型定义的指针变量里面,存储着地址数据。

地址 是 内存单元的编号 -- 就是编号本身 
  记录地址的指示牌 --- 相当于是指针变量 
 
 通过指针变量(指示牌) ---获得地址信息 
                        |----告诉说在哪里

通过指针引用数据

通过指针仅仅只能找到地址对应的空间,但如果想要访问这个空间,

还必须使用指针运算符  *  

* 地址数据

作用: 
       表示使用地址所在的空间。

int a=10;
int *p=&a;
*p

*p 表示使用 a的空间,对*p的操作就相当于对a的操作。

此时a的空间两种使用方式
 1.通过a直接使用 ---  直接访问 
 2.通过p来使用  ---  通过p拿到地址值 ,再对地址做*运算 ,才能使用到a的空间 ——间接访问

*p的运算过程:
1.从p中拿到地址值,到内存中找到对应的空间

2.从定位处开始偏移基类型大小sizeof(基类型)的一块空间

3.把这块空间当作一个基类型的变量/数据看待

用途

a.可以使函数带出多个结果   //指针间接访问

b.提高效率   函数传参   避免了大数据的拷贝 

c.在被调函数中,实现对主调函数中数据的使用和修改

想要实现 被调 修改 主调
  a.要修改谁 就把谁的地址传过去 
  b.被调函数中,还必须有对应的 *p 这样运算

函数传参的方式:
       值传递     --- 实参的值 给到 形参变量 
       地址传递   --- 可以实现被调修改主调

特殊的指针

NULL   ---空指针 --- 地址编号为 0 的地址
野指针(没有初始化的指针)--- 野指针 需要避免出现---指向不明确---可能指向可用空间,也可能指向不可用空间从而报错

指针与数组

指针的运算

算术运算 

关系运算

看的就是指针的数值 地址编号大的 就大

> >= < <= == !=
    p1 == &m

考点:判断大小端

int *isList(void)
{
int a=1;
char *p=(char *)&a;
return *p;
}

int main()
{
if(isList())
printf("小端");
else
printf("大端");
}

指针操作数组

数组的特点:
   连续 有序 单一 
   操作数组 --- 只需要获得首元素的地址即可

*(p+i) <=> a[i]
   a[i] //数组下标的方式 --- 其实本质就是 指针的运算 
   i[a]  // *(i+p)

说明:
     指针操作数组 --- 只需要获得 首元素地址即可 
     迭代  从上一个 推到 下一个

快速排序

在四种排序中效果最好。

需要用到指针,函数,递归。

step1: 找一个基准值 
      //数组的第一个元素 
step2: 从右往左 开始找 第一个比 基准值 小 的值 
step3: 从左往右 开始找 第一个比 基准值 大 的值
step4: 交换找到值,重复step2 到 step4 
       直到begin 和 end相遇 
step5: 相遇后,将相遇位置上的值 与 基准值 交换

step6: 对小的一部分 继续快速排序 
       对大的一部分 继续快速排序

     void QuickSort(int *begin,int *end)
177 {
178     int *p=begin;
179     int *q=end;   //记录进入函数时的begin和end
180                                                                                                                                                    
181     int *k=begin; //基准值
182 
183     if(begin>=end) //结束条件
184     {
185         return ;
186     }
187 
188     while(begin<end) //不一定只有一个值,寻找的循环,结束条件
189     {
190         while(begin<end&&*end>=*k) //从右至左找小值
191         {
192             end--;
193         }
194 
195         while(begin<end&&*begin<=*k) //从左至右找大值
196         {
197             begin++;
198         }
199 
200         swap(end,begin);      //交换两值
201     }
202 
203     if(begin==end)      //当begin和end相遇时,交换begin位置的值和基准值
204         swap(begin,k);
205 
206     QuickSort(p,end-1);  //对小的部分继续快速排序,函数的递归
207     QuickSort(begin+1,q);//对大的部分继续快速排序,函数的递归
208 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值