一、补充

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、迭代器与递归实现二分查找:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐