C语言指针讲解_第1页
C语言指针讲解_第2页
C语言指针讲解_第3页
C语言指针讲解_第4页
C语言指针讲解_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1C语言程序设计指针2指针指针是啥?指针基本运算函数中的指针指针与数组指针与动态数组指针与结构函数指针指针数组与多重指针实验3一、指针是啥什么是指针?假设Z同学是我们班作业做得最好的同学,大家都喜欢参考他的作业。Z=作业的标准答案可以把Z看作是一个作业类型的普通变量某天A同学找Z:“把作业借我参考一下?”周X回答:“标准答案在Y同学那里,你找他吧”Z=“标准答案在Y那里”这时候Z相当于一个指向别人(Y)的链接,他就变成了一个指针!4一、指针是啥指针(Point)实际上就是一个链接!指针变量中保存的内容是一个内存地址。例:int y=10;int *z=&y;指针z的内容就是y所在的内存

2、地址。“z,标准答案是多少?”z说:你去问y吧!y说:标准答案是10!5一、指针是啥int y=10;int *z=&y;10y内存地址10081008z内存地址1004z指向y6二、指针基本运算要学好指针,必须熟练掌握指针相关的运算。(接下来会提问!)如:指针的定义方法:在变量标识符前加*int *p,a,b; /定义了一个整型指针p和一个普通变量a&运算符:用在普通变量前,取其地址p=&a; /p指向a*运算符:用在指针变量前,取其指向的内存b=*p; /把p指向的内存中的整数值赋给整形变量b。*p=30;/将30赋给p指向的内存中对于指针p,*p相当于一个普通变量

3、!见01points.c(使用调试单步执行查看结果)72.1 &与*运算int a,b,*p;?a内存地址1008?b内存地址1004?p内存地址100082.1 &与*运算int a,b,*p;a=10;?a内存地址1008?b内存地址1004?p内存地址100092.1 &与*运算int a,b,*p;a=10;10a内存地址1008?b内存地址1004?p内存地址1000102.1 &与*运算int a,b,*p;a=10;p=&a;10a内存地址1008?b内存地址1004?p内存地址1000112.1 &与*运算int a,b,*p;a

4、=10;p=&a;10a内存地址1008?b内存地址10041000p内存地址1000122.1 &与*运算int a,b,*p;a=10;p=&a;b=*p;10a内存地址1008?b内存地址10041000p内存地址1000132.1 &与*运算int a,b,*p;a=10;p=&a;b=*p;10a内存地址100810b内存地址10041000p内存地址1000142.1 &与*运算int a,b,*p;a=10;p=&a;b=*p;*p=20;10a内存地址100810b内存地址10041000p内存地址1000152.1 &a

5、mp;与*运算int a,b,*p;a=10;p=&a;b=*p;*p=20;20a内存地址100810b内存地址10041000p内存地址1000162.1 &与*运算int a,b,*p;a=10;p=&a;b=*p;*p=20;(*p)+;20a内存地址100810b内存地址10041000p内存地址1000172.1 &与*运算int a,b,*p;a=10;p=&a;b=*p;*p=20;(*p)+;21a内存地址100810b内存地址10041000p内存地址1000182.1 &与*运算提问:见02points.c,回答问题192.

6、2 比较运算可以用=和!=来比较两个指针是否指向同一个内存地址。也可以使用和访问结构指针成员,这种用法更常见,如:p-name例:见18structpoints.c396.1 结构指针与参数使用结构指针来作为函数的形参是一种常见的函数定义方式。好处:利用结构的成员,一次可以传入多项数据,从而简化了函数的定义和调用使用结构指针做形参,可以在函数中修改结构的成员使用结构指针做形参,可以减少函数调用时参数内容复制的开销。后面我们会大量使用结构指针来做形参!406.2 链表利用结构指针,可以实现一种重要的数据结构链表。使用动态数组,我们可以解决程序编写时,不知道实际元素的数量导致的栈空间浪费问题。但动

7、态数组依然需要在为数组分配空间之前知道元素的数量!如果在实际使用中,实际元素的数量是经常动态变化的,那么动态数组依然会有内存浪费的问题。416.2 链表数组还存在另一个缺点,就是删除和插入元素的效率问题。如果要将一个新元素插入到数组的第3个位置上,那么从3到最后的全部元素都必须向后移动一位同样,删除元素需要将后面的全部元素向前移动一位链表解决了数组的这些缺点。它也是一种常用的数据结构。它的特点是:能够动态增加或减少元素插入或删除某个元素,只会影响和它相邻的两个元素。搞明白链表及其操作,指针就彻底学会了!426.2 链表链表(Chained List/Linked List)在形式上类似于现实中

8、的链条:由多个结点(node)组成每个结点中除数据外,还包含一个指针,指向链表中的下一个结点。通过指针,各结点依次连接成一个链表我们利用图形的形式来看一下链表436.2 链表数据数据数据数据数据哨兵结点1结点2结点3结点4结点5NULL链表头指针head单向链表的基本形式struct node int data; struct node* next;446.2 链表数据数据数据数据数据哨兵结点1结点2结点3结点4结点5NULL链表头指针head指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL)

9、 /访问数据p-data p=p-next;遍历链表456.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL) /访问数据p-data p=p-next;遍历链表哨兵466.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL) /

10、访问数据p-data p=p-next;遍历链表哨兵476.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL) /访问数据p-data p=p-next;遍历链表哨兵486.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL) /

11、访问数据p-data p=p-next;遍历链表哨兵496.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head遍历链表指针变量pstruct node int data; struct node* next;p=head-next;while(p-next!=NULL) /访问数据p-data p=p-next;NULL哨兵506.2 链表数据数据数据数据数据哨兵结点1结点2结点3结点4结点5链表头指针head新节点struct node int data; struct node* next;先使用遍历操作找到接点2;p2-next=p1-next;插入新结

12、点到结点2、3之间数据指针变量p1指针变量p2NULLNULL516.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5链表头指针head新节点struct node int data; struct node* next;先使用遍历操作找到接点2;p2-next=p1-next;p1-next-p2;插入新结点到结点2、3之间数据指针变量p1指针变量p2NULL哨兵526.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5链表头指针head新节点struct node int data; struct node* next;先使用遍历操作找到接点2;p2-next=p1-ne

13、xt;p1-next-p2;整理一下图形插入新结点到结点2、3之间数据指针变量p1指针变量p2NULL哨兵536.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5链表头指针head新节点struct node int data; struct node* next;先使用遍历操作找到接点2;p2-next=p1-next;p1-next-p2;整理一下图形插入新结点到结点2、3之间数据NULL哨兵546.2 链表数据数据数据数据数据哨兵结点1结点2结点3结点4结点5NULL链表头指针head指针变量p1struct node int data; struct node* next;令

14、p1指向结点1,p2指向结点2p1-next=p2-next;删除结点2指针变量p2556.2 链表数据数据数据数据数据结点1结点2结点3结点4结点5NULL链表头指针head指针变量p1struct node int data; struct node* next;令p1指向结点1,p2指向结点2p1-next=p2-next;整理图形删除结点2指针变量p2哨兵566.2 链表数据数据数据数据结点1结点3结点4结点5NULL链表头指针headstruct node int data; struct node* next;令p1指向结点1,p2指向结点2p1-next=p2-next;删除结点

15、2哨兵576.2 链表在单向链表的基础上,还可以进一步实现双向链表、循环链表等更复杂的数据结构。例:输入学生信息,学号为0时结束输入。保存并输出按照学号排序的信息。然后用户每输入一个名字,从存储中删除对应的信息,直到用户输入回车或存储为空为止。分析:使用链表保存学生信息每输入一个学生信息,动态建立一个结点,并插入到合适的位置最后使用遍历操作来输出学生信息例:19studentlink.c58七、函数指针指针实质上是一个内存地址。这个地址不但可以是数据的存放地址,也可以是一段代码的地址。函数指针就是一个指向函数地址的指针,即指向代码的指针。函数指针的定义及使用见20funcpoints.c利用函

16、数指针,可以实现很多非常强大的功能。597.1 函数指针做参数使用函数指针做函数的参数,可以用一个函数实现多个功能例:学生信息排序已知班上全部同学的信息,想按照不同的方式进行排序(按成绩、按年龄、按学号等等)能不能只写一个排序函数?用函数指针就可以实现!见21studentsort.c607.2 函数指针数组使用数组和函数指针,可以实现程序功能的动态调整例:动态菜单用户输入不同指令,执行不同的功能。用户可以从菜单中删除命令,也可以将命令加入菜单分析:用函数指针数组即可实现见22dynmenu.c61八、指针数组与多重指针指针同样可以作为数组的元素,从而形成数组指针。其实7.2节的22dynmenu.c里面已经用到数组指针了。数组指针的最常见用途是保存一组字符串,即字符指针数组。我们来看一个简单的例子:保存一组人名查询某个名字是否在这组人名中见23names.c628.2 多重指针通过指针参数,我们可以使用函数来交换两个变量的内容如果我们想用函数来交换两个指针变量指向的地址,该怎么办?多重指针,就是指向地址中的数据类型是指针的指针!使用二重指针做函数参数,就可以实现对指针指向地址的修改。例:交换两个字符指针指向的字符串。见24s63九、实现1.实现函数:void add(int a,int b,int *p)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论