还剩44页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言指针上课课件目录•指针基础•指针与数组•指针与函数•指针高级话题•指针常见错误与安全问题•实战练习指针基础01指针的定义指针是一个变量,其存储的是另一个变量的地址,而不是该变量的值01指针变量通常用“*”符号表示,并使用“”符号获取其他变量的地址02指针变量可以指向任何数据类型,包括基本数据类型、03结构体、联合体等指针的声明与初始化声明指针变量时,需要指定其初始化指针变量时,需要将其未初始化的指针变量可能指向指向的数据类型,例如int*p;设置为某个变量的地址,例如任何位置,因此在使用前必须表示p是一个指向整数的指针int x=10;int*p=x;表示p进行初始化指向x的地址指针的运算指针的算术运算可以通过加减法对指针进行运算,例如p表示指针向后移动一个单位(通常是所指向数据类型的大小),p--表示指针向前移动一个单位指针的比较运算可以通过比较运算符对指针进行比较,例如if p==q表示判断两个指针是否相等指针的强制类型转换可以将一个类型的指针转换为另一种类型的指针,例如int*p;float*q=float*p;表示将整型指针p转换为浮点型指针q指针与数组02数组的指针数组名可以视为指向可以通过指针进行数数组第一个元素的指组元素的访问和修改针数组名+整数n表示指向数组中第n个元素的指针通过指针访问数组元素使用*运算符通过指针访问数组元素通过指针修改数组元素的值指针的算术运算可以用于遍历数组元素指针与字符串字符串可以视为字符数组字符串常量会在内存中分配一个字符数组,并返回指向该数组第一个元素的指针使用指针访问和修改字符串中的字符指针与函数03指针作为函数参数传递地址01通过指针作为函数参数,可以将变量的地址传递给函数,从而在函数内部直接修改变量的值提高效率02通过传递地址,避免了数据的复制,提高了函数的执行效率灵活的参数传递03指针作为参数可以传递任意类型的数据,包括结构体、数组等复杂数据类型返回指针的函数010203动态内存分配自定义数据结构实现复杂功能通过返回指针的函数,可返回指针的函数可以用于返回指针的函数可以用于以在函数内部动态分配内创建自定义的数据结构,实现复杂的功能,如文件存,并返回指向该内存的如链表、树等操作、网络通信等指针函数指针指向函数的指针回调函数实现动态绑定函数指针是指向函数的指函数指针在很多场合下可通过函数指针和虚函数表针变量,可以通过函数指以作为回调函数使用,例等技术,可以实现动态绑针来调用函数如在排序算法、事件驱动定和多态性,这是面向对编程等场景中象编程的重要特性之一指针高级话题04指针与内存管理内存地址内存释放指针是一个变量,存储的是其他变量使用指针进行动态内存分配后,需要的内存地址通过指针可以间接访问手动释放不再使用的内存,以避免内和修改变量的值存泄漏内存分配C语言中,内存分为堆和栈两部分堆是动态分配的内存,而栈是自动分配的内存指针可以用于在堆上动态分配内存动态内存分配malloc函数calloc函数A B使用malloc函数可以在堆上动态分配指定大小calloc函数与malloc函数类似,但calloc函的内存,并返回一个指向该内存的指针数会初始化分配的内存为零realloc函数free函数C Drealloc函数用于重新分配已分配的内存大使用free函数可以释放已分配的内存,避免小它可以改变已分配内存的大小,并返回内存泄漏新的指针指向指针的指针二级指针三级指针动态二维数组指向指针的指针是指向指针变量三级指针是指向二级指针的指针使用二级和三级指针,可以在运的指针通过二级指针,可以改通过三级指针,可以改变指针所行时动态创建二维数组,并方便变指针所指向的值或地址指向的指针的值或地址地修改数组元素的值或地址指针常见错误与安全问题05野指针总结词详细描述野指针是指未初始化的指针,其指向的位置是随机的,在C语言中,指针变量在使用之前必须进行初始化,因此访问野指针会导致程序崩溃或未定义行为否则其指向的位置是未知的如果一个指针被声明了,但没有被初始化,那么它就是一个野指针试图访问野指针指向的内存会导致程序崩溃或产生未定义行为,这是非常危险的为了避免野指针的问题,程序员应该在使用指针之前确保对其进行初始化,或者使用NULL指针来初始化内存泄漏要点一要点二总结词详细描述内存泄漏是指程序在申请动态内存后,未能正确释放,导在C语言中,动态内存的申请和释放是由程序员手动管理致内存资源不断被占用,最终可能导致程序耗尽可用内存的如果程序员在申请动态内存后未能正确释放,就会导而崩溃致内存泄漏内存泄漏不仅会导致程序占用过多内存,还可能引发其他问题,如性能下降、程序崩溃等为了避免内存泄漏,程序员应该在使用完动态内存后及时释放,并使用工具如Valgrind进行内存泄漏检测空指针解引用总结词详细描述空指针解引用是指试图访问空指针所指向的内存位置,在C语言中,空指针是指值为NULL的指针如果一个这会导致程序崩溃或未定义行为指针被设置为NULL,那么它就不再指向任何有效的内存位置如果程序员试图通过一个空指针来访问内存,就会发生空指针解引用空指针解引用会导致程序崩溃或产生未定义行为,这是非常危险的为了避免空指针解引用的问题,程序员应该在使用指针之前检查它是否为NULL,确保指针指向有效的内存位置实战练习06利用指针实现冒泡排序冒泡排序原理通过相邻元素之间的比较和交换,将较大的元素逐渐往后移动,最终实现数组排序指针在冒泡排序中的应用使用指针来指向数组元素,通过交换指针所指向的元素来达到排序的目的利用指针实现冒泡排序代码实现```cvoid bubbleSortint*arr,int n{利用指针实现冒泡排序for inti=0;in-1;i{for intj=0;jn-i-1;j{if*arr+j*arr+j+1{利用指针实现冒泡排序//交换*arr+j和*arr+j+101int temp=*arr+j;02arr+j=arr+j+1;03利用指针实现冒泡排序•*arr+j+1=temp;利用指针实现冒泡排序}1}2}3利用指针实现冒泡排序}```利用指针实现二分查找•二分查找原理在有序数组中,取中间元素作为比较对象,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较如果在某一步骤数组为空,则代表找不到这种搜索算法每一次比较都使搜索范围缩小一半利用指针实现二分查找•指针在二分查找中的应用使用指针来指向数组元素,通过比较指针所指向的元素来达到查找的目的利用指针实现二分查找代码实现```cint binarySearchint*arr,int left,int right,int x{利用指针实现二分查找while left=right{int mid=left+right-left/2;利用指针实现二分查找•if*arr+mid==x{利用指针实现二分查找return mid;}else if*arr+midx{利用指针实现二分查找•left=mid+1;利用指针实现二分查找01}else{02right=mid-1;利用指针实现二分查找}01}02return-1;//如果未找到,则返回-103利用指针实现二分查找}```利用指针实现链表操作链表原理指针在链表操作中的应用链表是一种常见的数据结构,它由多个使用指针来指向链表节点,通过修改指针节点组成,每个节点包含数据和指向下所指向的节点来达到操作链表的目的一个节点的指针链表主要用于实现动VS态数据集合,例如动态数组或堆栈利用指针实现链表操作•代码实现(插入节点)利用指针实现链表操作```cvoid insertNodestruct Node head_ref,intnew_data{struct Node*new_node=structNode*mallocsizeofstruct Node;//创建新节点利用指针实现链表操作new_node-data=new_data;new_node-next=*head_ref=new_node;////将新数据存储在新节点中*head_ref;//将新节点指向将头指针指向新节点,完成插入当前头节点(或空)操作利用指针实现链表操作}```谢谢聆听。