嵌入式培训之C语言学习(十四)指针(2):指针与一维整型数组,快速排序,迭代器,递归
1、指针的强制类型转换2、编写代码检测计算机为小端存储(运行结果为10)还是大端存储(运行结果为0);运行结果为103、符号位扩展:运行结果:FFFF87564、指针的本质是存储的地址,所以在对指针进行算术运算加1时,偏移的字节数取决于指针所指向的数据类型的大小(偏移sizeof(基类型)个字节);注意:一边为指针,一边为整型;地址与地址之间不能求和,但可以求差(如果相减,表示之间相差几个基类型字
一、补充
1、指针的强制类型转换:

2、编写代码检测计算机为小端存储(运行结果为10)还是大端存储(运行结果为0);

运行结果为10

3、符号位扩展:

运行结果:FFFF8756
4、指针的本质是存储的地址,所以在对指针进行算术运算加1时,偏移的字节数取决于
指针所指向的数据类型的大小(偏移sizeof(基类型)个字节);
注意:一边为指针,一边为整型;
地址与地址之间不能求和,但可以求差(如果相减,表示之间相差几个基类型字
节,根据正负可以判断谁在前谁在后);
必须保证基类型相同。
指针+n:向后偏移sizeof(基类型) X n个字节,如:

偏移4个字节

运行结果:10 随机数
产生随机数原因:(p+1)是野指针,因为p+1会根据int类型在系统中的字节大小进行地
址偏移,但这里的i只是单个变量,在i之后的内存区域不一定能够合法访问,所以为野
指针,但对于数组来说具有单一性、连续性、有序性,可以实现上述操作。
二、指向数组元素的指针
(一)指针的运算
1. 指向数组元素的指针
int a[10];
int *p;
要让该指针指向数组元素,即:
p = &a[0]; <==> p = a; 二者是等价的,都表示p指向数组a的首元素地址,如:

指针变量p指向数组的首元素地址(a[0]),运行结果为1
2.通过指针引用数组元素
(1)如果指针变量p指向数组中的一个元素,则p+1表示指向同一数组的下一个元素,偏移字节数也遵循sizeof(基类型)个字节。
(2)p+i 和 a+i 都表示a[i]的地址,即他们都指向a数组的第 i 个元素。
(3)*(p + i) 和 *(a + i)表示它们所指向的数组元素,是元素的值,即a[i]。例:

指针变量p指向a[1](在首元素地址上向后偏移4个字节),运行结果为2
3、补充:
指针变量的运算(单目运算符自右向左运算):
p ++ :使p指向下一个元素,即a[1],再指向*p,则得到下一个元素a[1]的值;
* p ++:先得到p指向的变量的值即(*p),再让p+1,这样下一步操作时,*p表示的就是下一个元素的值,输出结果仍为a[0];
*(++p):先让p+1,再取*p,输出结果为a[1];
(*p) ++:表示p所指的元素值加1,并不是指针值加1;

*与++运算符优先级相同,自右向左,运行结果为1 2
难点:

打出来的都是a[0],运行结果为2 2

运行结果:1 2
注:分清++到底加的是谁(p还是*p)
(二)指针与一维整型数组
1、遍历数组:

注:循环结束指针变量p指向末尾元素的下一个元素(此时为野指针)

注:指针变量p还是指向a[0]

注:下标与数组,效率完全相同

注:*a为地址值常量为右值,不能做左值,程序编译报错(*p++就可以)
2、数组函数用指针封装遍历:

3、用指针求数组元素最大值:

4、数组元素逆序输出:


5、数组元素逆序写法2(调用swap函数):

6、用指针对数组进行选择排序:

7、二分查找,返回值为指针的函数(指针型函数):


8、指针的比较运算:要保持基类型一致

(三)空指针
(1)int *p = NULL;
(2)空指针表示的是指针的一种状态,表示当前指针不能被访问,它并不指向任何地方,所以在定义了空指针之后,仍然不能直接对指针进行赋值操作,在使用之前要进行判断是否为空指针。
四、快速排序
1、思想:分而治之
2、实现思路
(1)基准值—就是数组首元素a[0]位置的值,a[0]这个位置也叫基准值位置;
(2)end 从右边开始找,找到第一个比基准值小的数,然后停止找;
(3)begin 从左边开始找,找到第一个比基准值大的数,然后停止;
(4)将找到这两个数交换位置,继续重复2-4的过程,直到begin与end相遇,此时这个过程结束结束;
(5)将基准位置上值与此时begin与end所谓位置的元素交换;
(6)继续对左一半和右一半进行快速排序,直到最后一次begin和end一开始找就在一个位置上。
3、快速排序算法代码实现:


五、迭代思想与递归
用begin代表数组起始位置,end代表数组的结束位置,二者一起划定了一个连续的元
素集合范围,后续操作只需要针对这个范围内的元素,可以更简洁,更精准的实现算
法。
1、循环遍历数组(采用迭代器)

2、数组的遍历(用递归调用和迭代器)

3、数组的逆序(用迭代器):

4、数组的逆序(用递归调用和迭代器实现):

5、迭代器选择排序

6、迭代器冒泡排序

7、迭代器插入排序:

补充:地址和地址之间不能求和 即p + q是不合法的,但是可以相减

运行结果为1,表示p和q之间差了一个(int型 4字节的)基类型;
8、用迭代器方式实现二分查找:


9、迭代器与递归实现二分查找:

更多推荐



所有评论(0)