![编程语言基础-语言-第8章-指针课件_第1页](http://file4.renrendoc.com/view/66d4734fe9ca8227b4ee328d83fd2ea3/66d4734fe9ca8227b4ee328d83fd2ea31.gif)
![编程语言基础-语言-第8章-指针课件_第2页](http://file4.renrendoc.com/view/66d4734fe9ca8227b4ee328d83fd2ea3/66d4734fe9ca8227b4ee328d83fd2ea32.gif)
![编程语言基础-语言-第8章-指针课件_第3页](http://file4.renrendoc.com/view/66d4734fe9ca8227b4ee328d83fd2ea3/66d4734fe9ca8227b4ee328d83fd2ea33.gif)
![编程语言基础-语言-第8章-指针课件_第4页](http://file4.renrendoc.com/view/66d4734fe9ca8227b4ee328d83fd2ea3/66d4734fe9ca8227b4ee328d83fd2ea34.gif)
![编程语言基础-语言-第8章-指针课件_第5页](http://file4.renrendoc.com/view/66d4734fe9ca8227b4ee328d83fd2ea3/66d4734fe9ca8227b4ee328d83fd2ea35.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章指针第8章指针8.1指针的概念指针,也就是内存地址。指针变量是用来存放这些内存地址的变量。不同类型指针变量所占用的存储单元长度是相同的.直接访问方式:根据变量名实现对存储空间的访问。间接访问方式:通过存放地址的指针变量实现对存储空间的访问。8.1指针的概念指针,也就是内存地址。如果将变量x的地址2060存放到另一个变量p中,即p的值为2060,这样通过变量p可以找到变量x的地址,从而找到x的值。存放地址的变量p就是指针变量。可以形象地说,p指向x。如果将变量x的地址2060存放到另一个变量p中,即p的值为2"*"是指针运算符,或称为“间接访问”运算符。*p表示指针变量p所指向的变量。若要改变x变量的值,也可通过改变*p的值来实现。如执行*p=47;则此时x=47。"&"也是一个指针运算符,称为取地址运算符。如为了让指针p指向变量x,可执行p=&x,此时变量x的地址即存入了指针p中。注意,指针变量只能存放地址值,不要将一个整型数据赋给一个指针变量。"*"是指针运算符,或称为“间接访问”运算符。*p表示指针8.2指向简单变量的指针指针变量也必须先定义后使用。格式如下: 类型标识符*指针变量名; 例如: int*p1,p2;则p1是指针变量,而p2是整型变量。8.2指向简单变量的指针指针变量也必须先定义后使用。例8-1:通过指针变量访问变量。main(){inta,b,*p1,*p2; floatx,y,*q1,*q2; a=123;b=45; x=1.25;y=-0.98; p1=&a; p2=&b; q1=&x; q2=q1; printf("\na=%d,b=%d\n",a,b); printf("*p1=%d,*p2=%d\n",*p1,*p2); printf("x=%f,y=%f\n",x,y); printf("*q1=%f,*q2=%f\n",*q1,*q2);}例8-1:通过指针变量访问变量。main()例8-1运行结果例8-1运行结果8.3指向数组的指针变量任何可通过数组下标完成的操作也可通过指针完成。然而它们之间也存在细微但很重要的区别。一般来讲,使用指针速度更快,程序更紧凑。8.3指向数组的指针变量任何可通过数组下标完成的操作也可通8.3.1指向一维数组的指针变量指针变量可以指向数组或数组元素,即把数组的起始地址或某一元素的地址存放到一个指针变量中。例如:定义指针p指向一维整型数组a[5]。可进行如下说明: inta[5]; int*p;注意,不能定义成 int*p[5];如果这样定义,就表示定义了一个指针数组。它有5个元素,p[0]、p[1]、p[2]、p[3]、p[4],每个元素都指向整型变量。8.3.1指向一维数组的指针变量指针变量可以指向数组或数组如果数组为int型,则指针变量亦应指向int型。执行语句: p=a; 或 p=&a[0];均可以使指针p指向数组a的第1个元素a[0]。C语言规定,数组名代表数组的首地址,也就是第一个元素的地址。此外,p+1指向下一个元素,p+i指向p后的第i个元素a[i]。无论某个数组的元素占据多少内存字节(即元素长度,设为len),当指针p指向其中一个元素时,p+1均是指向它的下一个元素,而不是p+len。可见,a[i],*(a+i),*(p+i)都是等价的。如果数组为int型,则指针变量亦应指向int型。例8-2:用三种方法输出数组元素。 main() { staticinta[5]={5,4,3,2,1}; inti,*p=a; for(i=0;i<5;i++) printf("%d,%d,%d\n",a[i],*(a+i),*(p+i)); } 运行结果: 5,5,5 4,4,4 3,3,3 2,2,2 1,1,1例8-2:用三种方法输出数组元素。 main()例8-3:输出数组的所有元素。 main() { inta[5],*p,i; for(i=0;i<5;i++) scanf("%d",a+i); for(p=a;p<a+5;p++) printf("%4d",*p); } 运行结果: 13579↙ 13579说明:指针变量和数组名有区别,指针变量是一个变量,可以改变其值,而数组名是数组首地址,是一个地址常量,不能对它赋值。例8-3:输出数组的所有元素。 main()说明:指针8.3.2指向多维数组的指针变量C语言将二维数组定义时的行数和列数分别用两个方括号分开,如inta[4][3];,目的是把二维数组看作是一种特殊的一维数组,它的元素又是一个一维数组。如,把a看作是由四个元素a[0]、a[1]、a[2]、a[3]组成的一维数组,而每个元素a[i](i=0,1,2,3),又都是具有3个元素的一维数组。8.3.2指向多维数组的指针变量C语言将二维数组定义时的例8-5:输出数组inta[4][3]中的
第3行的所有元素。main() { staticinta[4][3]={{1,2,3},{4,5,6}, {7,8,9},{10,11,12}}; int*p; for(p=a[2];p<a[2]+3;p++) printf("%4d",*p); }运行结果:789例8-5:输出数组inta[4][3]中的
第3行的所有例8-8:用指针输出二维数组的各元素。
#include<stdio.h> #defineM4 #defineN3 #defineLM*N main() { inta[M][N],*p=a[0],i; for(;p<a[0]+L;p++) /*从键盘上输入L个数据 */ scanf("%d",p); for(i=0;i<M;i++) { p=a[i]; /*取第i行的首地址 */ for(;p<a[i]+N;p++) /*输出第i行的n个元素 */ printf("%5d",*p); printf("\n"); /*换行 */ } }例8-8:用指针输出二维数组的各元素。 #include<8.4指向字符串的指针变量在C语言中,字符串可以用字符数组实现。其实,字符串还可以用字符指针实现,而且字符指针更方便、简洁。例如: charstring[]="thisisastring!"; char*pstr="thatisabook!";8.4指向字符串的指针变量在C语言中,字符串可以用字符数组例8-10:编写字符串复制函数strcpy(s1,s2)。用数组方法 voidstrcpy(chars1[],chars2[]) {inti=0; while(s2[i]!='\0') {s1[i]=s2[i]; i++; } s1[i]=0;/*补上串结尾符*/ }例8-10:编写字符串复制函数strcpy(s1,s2用指针方法 voidstrcpy(char*p,char*q) { while(*q!='\0') {*p=*q; p++; q++; } *p=0;/*补上串结尾符*/ }用指针方法例8-12:分别用字符指针和字符数组表示字符串。 #include<stdio.h> main() { chars1[5],s2[8],*p; p=s2; scanf("%s%s",s1,p); puts(s1); puts(p); } 运行上述程序: qweiop↙ qwe iop例8-12:分别用字符指针和字符数组表示字符串。 #incl例8-13:改变数组指针的程序。 #include<stdio.h> main() { char*p="moneyorder"; p=p+6; printf("%s\n",p); }运行结果: order例8-13:改变数组指针的程序。 #include<std8.5指针作为函数参数例8-15:输入两个整数a,b,从大到小输出。 main() { inta,b; scanf("%d%d",&a,&b); if(a<b) swap(&a,&b); printf("%d%d\n",a,b); } swap(int*q1,int*q2) { inttmp=*q1; *q1=*q2; *q2=tmp; }8.5指针作为函数参数例8-15:输入两个整数a,b,从8.6指向结构体的指针变量
#include<stdio.h> structstudent { charxh[3],xm[7]; intcj; }; main() { structstudent*p,s; p=&s;/*将结构体变量s的起始地址存入指针p中*/ scanf("%s%s%d",(*p).xh,(*p).xm,&s.cj); /*可通过指针p对s的域赋值*/ printf("%s,%s,%d",p->xh,p->xm,p->cj); /*通过指针p输出s的内容*/ }运行:30wang79↙30,wang,79以下3种形式等价:①s.xh②(*p).xh③p->xh8.6指向结构体的指针变量 #include<stdio8.7应用实例例8-20:将数组b中n个整数按相反顺序存放。 invert1(intb[],intn)/*用数组实现*/ {inttmp,i,j,m=n/2; i=0;j=n-1; for(;i<m;i++,j--) { tmp=b[i]; b[i]=b[j]; b[j]=tmp; } }invert2(int*p,intn){inttmp,*i,*j;i=p;j=p+n-1;for(;i<j;i++,j--){ tmp=*i; *i=*j; *j=tmp;}}/*用指针实现*/8.7应用实例例8-20:将数组b中n个整数按相反顺序存本章
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Trilysine-TFA-生命科学试剂-MCE-4187
- KIF18A-IN-15-生命科学试剂-MCE-5317
- 4-4-Dimethoxyoctafluorobiphenyl-生命科学试剂-MCE-5198
- 1-3-Dinervonoyl-glycerol-生命科学试剂-MCE-1243
- 2025年度特色民宿体验住宿协议
- 二零二五年度消防设备定制设计与销售合同
- 二零二五年度农产品线上线下一体化购销合同标准
- 施工现场施工防传染病传播制度
- 个人兼职用工合同模板
- 乡村别墅租赁合同样本
- 老师呀请你别生气教学反思
- 2023年北京市平谷区中考英语二模试卷
- 变压器更换施工方案
- 【高分复习笔记】陈澄《新编地理教学论》笔记和课后习题详解
- 安徽新宸新材料有限公司年产6000吨锂离子电池材料双氟磺酰亚胺锂项目环境影响报告书
- 日本酒类消费行业市场分析报告
- GB/T 29594-2013可再分散性乳胶粉
- 西子奥的斯电梯ACD2调试说明书
- 成长感恩责任高中主题班会-课件
- 建设项目全过程工程咨询服务指引(咨询企业版)(征求意见稿)
- 分手的协议书模板(5篇)
评论
0/150
提交评论