




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计大赛培训之指针,教学实践部计算机中心胡晓丽,指针的用途,指针在C语言里应用极为广泛,是C语言的灵魂使程序简洁、紧凑、高效函数调用时批量参数的传递内存的动态分配内存地址的直接处理复杂数据结构的简洁表达等许多其它数据类型难以实现的复杂操作,培训目的,掌握指针的概念、指针变量定义格式和引用掌握指针的运算方法指针应用举例,理解指针,指针就是内存中的变量的地址,理解指针,内存单元的编号:计算机内存中,每一个字节的存储单元都有一个编号(亦称为内存地址)在VC中,内存单元的编号是一个8位的十六进制数(表示32位二进制数,VC是32位编译系统)如:0013FF7C,理解指针,变量:实质是代表了“内存中的某个存储单元”。,若在内存中定义了一个变量,则这个变量的内存的地址也就确定了。,理解指针,变量的地址:表示变量在内存中的位置,其值是该变量在内存中所占存储单元的首字节的编号,程序中:inti;floatk;,内存中每个字节有一个编号-地址,i,k,编译或函数调用时为其分配内存单元,变量是对程序中数据存储空间的抽象,理解指针,a在内存中占4个字节,但a=8;printf(%d%pn,a,理解指针,理解指针,我们在程序中只需要指出变量名,无需知道每个变量在内存中的具体地址,每个变量与具体地址的联系是由C编译系统来完成的。对变量的存取操作就是对某个存储单元进行操作。这种直接按变量的地址存取变量值的方式称为“直接存取”。,4502,实验室二,我有几种方法可以到实验室上机?,2、按实验室所在的教室编号,1、按实验室名字,按变量名,按变量地址(即指针),实验室一,实验室三,4503,4707,理解指针,理解指针,指针:也是一种变量,这种变量是用来存放内存地址的。,指针变量,指针是字节的编号,即地址。指针也是要存储的,因此每个指针也需要一个变量来存储它。这个变量称为指针变量。指针变量的值是某一定义好的变量的地址。,理解指针变量,inta=3;,1012,2002,间接存取:这种通过变量p到变量a的地址,然后再存取变量a的值的方式称为“间接存取”。,指针变量p指向了变量a的含义是:指针p中存放了变量a的地址。,指针变量的定义,定义形式如下:数据类型*指针变量名;如:int*p1,num;表示的意思为:定义了一个指针变量p1,它指向的是一个整型数据。或者说,这时候p1中存储的是一个整型变量的地址。注意:指针变量定义了之后,需要给它赋一个确定的变量的地址,否则,就会出现严重的系统错误。,指针变量的引用,#include,main(),inta;/定义一个整型变量a,int*p1;/定义指向整型变量的指针p1,p1=/p1中应存放变量a的地址,*p1=5;/通过指针变量p1给a赋值,printf(a=%d,a);,例:int*p,*s,k=20;s=,20,2000,2000,2004,2004,s=*pk=*s所以:k=*p,说明:(1)指针p的基类型是int类型的指针。(2)是求地址运算符。(3)因为基本数据类型int、float、char等所需存储空间不同,所以需要定义指针变量的基类型。,例:指针的概念,main()inta;int*pa=,运行结果:a:10*pa:10,DD04,q+;,DD06,q-;,DD04,i=*p;,11,j=*q;,33,例:,指针的运算方法,指针的比较,在关系表达式中,可以对指针进行比较。即两个变量地址的比较。,通常两个或多个指针指向同一目标时(一串连续的存储单元),比较才有意义。,指针应用举例-指针作为函数的参数,指针可以作为参数在主调函数和被调用函数之间传递数据,通过指针可以在被调用函数中地调用中的变量进行引用,这也就使得通过形参改变对应实参的值有了可能,利用此形式就可以把两个或两个以上的数据从被调用的函数返回到调用函数。,例将数从大到小输出,指针应用举例-指针作为函数的参数,swap(intx,inty)inttemp;temp=x;x=y;y=temp;main()inta,b;scanf(%d,%d,指针应用举例-指针作为函数的参数,5,9,5,5,9,COPY,swap(intx,inty)inttemp;temp=x;x=y;y=temp;main()inta,b;scanf(%d,%d,指针应用举例-指针作为函数的参数,swap(intx,inty)inttemp;temp=x;x=y;y=temp;main()inta,b;scanf(%d,%d,值传递,运行结果:5,9,(swap),5,9,5,9,5,swap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,5,9,2000,2002,5,9,COPY,5,运行结果:9,5,地址传递,通过传送地址值,可以在被调用函数中直接改变调用函数中的变量的值,指针应用举例-指针作为函数的参数,指针应用举例-指向数组的指针变量,例编写程序,定义一个含有15个元素的数组,并编写函数分别完成以下操作:(1)调用C库函数中的随机函数给所有元素赋以049之间的随机数;(2)输出数组元素中的值;(3)按顺序对每隔三个数求一个和数,并传回主函数;(4)最后输出所有求出的和值。,指针应用举例-指向数组的指针变量,调用随机函数的方法如下:包含头文件stdlib.hn=rand()%x;n将得到一个在0(x-1)之间的随机数。,指针应用举例-指向数组的指针变量,分析:(1)由于要每隔3个数求一个和,15个数要求出5个和,所以主函数中要定义一个数组来存放5个和数。(2)两次输出元素的值,虽然输出对象不同,但是数组的类型相同,可调用一个函数来完成,只要指定不同的数组名,不同的输出个数即可。,指针应用举例-指向数组的指针变量,#includestdio.h#includestdlib.h#defineSIZE15#defineN3voidgetrand(int*,int);voidgetave(int*,int*,int);voidprintarr(int*,int);,指针应用举例-指向数组的指针变量,voidprintarr(int*a,intn)inti;for(i=0;in;i+)printf(%4d,*(a+i);if(i+1)%5=0)printf(n);printf(n);,指针应用举例-指向数组的指针变量,voidgetave(int*a,int*b,intn)inti,j=0,sum=0;for(i=0;in;i+)sum+=*(a+i);/*累加数组元素*/if(i+1)%3=0)/*每累加3个进行一次处理*/bj=sum;sum=0;j+;,指针应用举例-指向数组的指针变量,voidgetrand(int*a,intn)inti;for(i=0;in;i+)*(a+i)=rand()%50;,指针应用举例-指向数组的指针变量,main()intxSIZE,wSIZE/N=0;/*数组中置初值为0,准备存放5个数的和*/clrscr();getrand(x,SIZE);/*调用函数产生15个随机数放入数组x中*/printf(nOutput%drandomnumbers:n,SIZE);printarr(x,SIZE);/*输出15个随机数*/getave(x,w,SIZE);/*每3个数求一个和放入数组w中*/printf(nOutput5sumnumbers:n);printarr(w,SIZE/N);/*输出5个数的和*/,指针应用举例-指向数组的指针变量,指针应用举例-指向数组的指针变量,例:编写程序,将数组中的数按颠倒的顺序重新存放。在操作时,只能借助一个临时存储单元而不得另外开辟数组。,分析:不是要求按颠倒的顺序打印数据,而是要求按逆序重新放置数组中的内容。假定a数组中有8个元素,指针应用举例-指向数组的指针变量,指针应用举例-指向数组的指针变量,(1)定义两个变量i和j,首先将a0,a7进行对调,中间用到一个临时存储单元,所以定义同类型变量temp。(2)将变量i加1,j减1,满足条件ij时,将a1和a6进行对调(3)最后将a3和a4进行对调,此时i+1,j-1不再满足条件ij,指针应用举例-指向数组的指针变量,#includestdio.h#defineNUM8voidinvert(int*,int);voidpriout(int*,int);,main()intaNUM=10,20,30,40,50,60,70,80;printf(nOutputprimarydata:);priout(a,NUM);invert(a,NUM);printf(nOutputtheinversedata:);priout(a,NUM);,指针应用举例-指向数组的指针变量,voidpriout(ints,intn)inti;for(i=0;in;i+)printf(%4d,si);printf(n);,voidinvert(int*a,intn)inti,j,temp;for(i=0,j=n-1;ij;i+,j-)temp=*(a+i);*(a+i)=*(a+j);*(a+j)=temp;,指针应用举例-指向数组的指针变量,例:w数组中存放了n个数据,编写函数删除下标为k的元素的值。,指针应用举例-指向数组的指针变量,k,26,27,28,29,30,指针应用举例-指向数组的指针变量,getindex:用于输入所删除元素的下标,函数中对输入的下标进行检查,若越界,则要求重新输入,直到正确为止。arrout:用于输出数组中的元素arrdel:进行所要求的删除操作,指针应用举例-指向数组的指针变量,#includestdio.h#defineNUM10intarrdel(int*,int,int);voidarrout(int*,int);intgetindex(intn);,指针应用举例-指向数组的指针变量,main()intn,d,aNUM=21,22,23,24,25,26,27,28,29,30;n=NUM;printf(Outputprimarydata:n);arrout(a,n);d=getindex(n);n=arrdel(a,n,d);printf(nOutputthedataafterdelete:n);arrout(a,n);,指针应用举例-指向数组的指针变量,getindex(intn)intp;doprintf(nEntertheindex0n-1);returnp;,voidarrout(intw,intm)intk;for(k=0;knext;/*p指向头结点后的第一个结点*/if(p=0)printf(LinklistisNULL!n);elseprintf(head);doprintf(-%d,p-data);/*输出当前结点数据域中的值*/p=p-next;while(p!=0);printf(-endn);,(2)在单向链表中插入结点,s:用来指向新开辟的结点p:指向插入的位置q:p的前趋结点,q,p,s,链表非空,值为x结点存在,插在x结点前链表非空,值为x结点不存在,插在表尾链表为空,插在表尾,即头结点之后。,s-next=p;q-next=s;,指针应用举例-链表,指针应用举例-链表,insert_snode(SLIST*head,intx,inty)SLIST*s,*p,*q;s=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《2022-2023年度七下英语科质量检测卷二》
- 牛津树-自然拼读-等级2-level 2 -U2-Lesson1
- 部编版二年级上册第六单元《大禹治水》教案
- 建筑施工特种作业-建筑起重机械安装拆卸工(物料提升机)真题库-3
- 建筑施工特种作业-高处作业吊篮安装拆卸工真题库-3
- 山东卫视招聘题目及答案
- 散文妈妈题目大全及答案
- 软件研发答辩题目及答案
- 5 2 平面向量的数量积-2026版53高考数学总复习A版精炼
- 2023-2024学年云南省高二下学期期末教学模拟考试数学试题(解析版)
- 物业服务外包合同
- 企业注销登记申请书(适用于公司、非公司企业法人、合伙企业、个人独资企业)
- NBT 33015-2014 电化学储能系统接入配电网技术规定
- GB/T 44260-2024虚拟电厂资源配置与评估技术规范
- 《微动探测技术规程》
- 【经济法学】2024年国家开放大学春季期末考试真题及答案
- 国家开放大学本科《理工英语4》一平台机考第三大题阅读理解选择总题库
- 2024年四川省乐山市中考生物试卷附答案
- 助贷贷款服务合同范本
- JBT 14543-2024 无刷稳速直流电动机技术规范(正式版)
- 2023-2024学年广东省广州市荔湾区八年级物理第二学期期末学业水平测试模拟试题及答案解析
评论
0/150
提交评论