版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 指针,内蒙古科技大学 工程训练中心,2020年8月15日10时9分,工程训练中心 徐国海,什么是指针?,为了有效的管理各存储单元,我们为每个存储单元进行编号,这个编号就是地址。,地址又称为指针,指针就是存储单元的地址。 pointer,内存中有许多存储单元,存储单元用来存放数据。,3050,3052,3054,2020年8月15日10时9分,工程训练中心 徐国海,什么是指针变量?,我们把存储单元地址作为其值的变量,叫做指针变量。,内存中用户数据区,i,j,k,3050,3052,3054,p,用取地址符号“ float *f ; char *c ;,基类型:用来说明指针要指向的变量类型
2、。不同类型的变量在内存中所占的字节数是不同的。,当进行指针运算时,如指针移动1,系统内部的地址则根据基类型的不同移动不同的字节数,所以必须指定指针变量的基类型。,2020年8月15日10时9分,工程训练中心 徐国海,指向简单变量的指针,如:int a,b,c,*p1,*p2;,10,a=10;b=20;c=30;,20,30,指针变量的三种赋值方式:,1、 p1NULL;或 p1=0;,0,2、 p1 scanf(“%d”, countptr=,2020年8月15日10时9分,工程训练中心 徐国海,(2) 取内容运算(*),如: int a, *p= scanf(%d,%d, ,p1,a,范例
3、3:用指针实现两个数由大到小的输出。,2020年8月15日10时9分,工程训练中心 徐国海,2、算术运算 指向数组的指针 (1) 加减运算 加减运算常用于数组的处理。对指向一般数据的指针,加减运算无实际意义。,float a10, *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第四个分量*/,int a10, *p=a, *x; x=p+3; /*实际上是p加上3*2个字节赋给x, x指向数组的第四个分量*/,对于不同基类型的指针,指针变量“加上”或“减去”一个整数n所移动的字节数是不同的。例如:,2020年8月15日10时9分,工程训练中心 徐国海
4、,(2) 自增自减运算 指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。 例如:,*p+相当于*(p+ +)。 *(p+)与(*p)+ 中的“+”含义不同,前者表示地址自增,后者表示当前所指向的数据值自增。,int a10, *p=a, *x; x=p+; /* x指向数组的第一个元素, p指向数组的第二个元素*/ x=+p; /* x、 p均指向数组的第三个元素*/,点击 move ,进一步了解指针移动。,2020年8月15日10时9分,工程训练中心 徐国海,3. 关系运算 两指针的关系运算表示两指针的先后位置关系, 一般用于数组处理。除空指针外,不能进行指
5、针与一般数值的关系运算。,变量,a0,地址,1000,1002,1004,1006,1008,内容,a1,a2,a3,a4,p1,p2,1008,1000,(3) 指针相减 指针相减得到两指针之间数据的个数, 一般用于数组处理。,2020年8月15日10时9分,工程训练中心 徐国海,对数组数据(即数组元素)的操作,可以利用指向数组元素的指针变量来完成,具体步骤如下: 第一步:定义基类型与数组类型相同的指针变量。即定义指向数组元素的指针变量。 第二步:在指针变量与要处理的数组(元素)之间建立关联。即将相应数组的首地址(或元素地址)赋给指针变量。 第三步:使用指针变量的各种运算来实现对各个数组元素
6、的具体操作。,指向一维数组的指针变量,2020年8月15日10时9分,工程训练中心 徐国海,例如,要利用指针处理整型数组a: (1) int a10,*p; /*定义指针变量*/,return,1000,(2) p=a; 或 p= for(i=0;i=0;i-) printf(“%4d”,ai); ,#include void main( ) int a10,i; for(i=0;i=0;i-) printf(“%4d”,*(a+i); ,#include void main( ) int a10,i,*p=a; for(i=0;i=a;p-) printf(“%4d“,*p); ,下标法,
7、位移法, 指针法,2020年8月15日10时9分,工程训练中心 徐国海,2020年8月15日10时9分,工程训练中心 徐国海,指针移动示例,#include void main( ) int a6,i,*p; p=a; for(i=0;i6;i+) scanf(“%d”,p+); printf(“n”); for(i=0;i6;i+,p+) printf(“%d ”,*p); ,a0,a5,p=a;,2020年8月15日10时9分,工程训练中心 徐国海,使用指针变量时应注意的问题:, 指针变量的值可以改变。 要注意指针变量的当前值。 注意指针变量的运算,如先使p指向数组a的首地址(即p=a),
8、则: p+,使p指向下一个元素a1。如果接着执行*p,则取出a1的值。 *p+等价于*(p+)作用是:先得到p指向的变量的值(即*p),然后再将p+1=p *(p+)*(+p)的作用不同,前者是先取*p的值,然后使p加1,而后者是先使p加1,再取*p (*p)+表示p所指向的元素的值加1 如p当前指向a数组中的第i个元素(即:p=,二维数组可以看成数组名分别为a0、a1、a2的一维数组。,指针与二维数组,2020年8月15日10时9分,工程训练中心 徐国海,从二维数组的角度看,a代表二维数组首元素的地址,而现在的首元素不是一 个整型变量,而是一个由4个整型数组成的二维数组。因此a代表的是首行(
9、第0行) 的首地址,a+1代表的是第1行的首地址,a+2代表的是第2行的首地址。,2020年8月15日10时9分,工程训练中心 徐国海,a0、a1、a2是一维数组,而数组名表示数组首元素的地址,因此 a0代表一维数组a0中第0列元素的地址 ( printf(%d,%dn,a,*a); printf(%d,%dn,a,*(a+0); printf(%d,%dn, ,例题一 输出二维数组有关的值,2020年8月15日10时9分,工程训练中心 徐国海,#include void main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p,i,j; f
10、or(i=0;i3;i+) for(j=0;j4;j+) printf(%4d,aij); printf(n); for(p=a0;pa0+12;p+) printf(%4d,*p); printf(n); ,例题二 用指针变量输出数组元素的值,2020年8月15日10时9分,工程训练中心 徐国海,指向二维数组的指针,为了便于访问二维数组,c语言专门设置了指向由n个元素组成的一维数组的指针,定义格式为: 类型 (*指针名)常量表达式;,如: int (*p)4; 说明p指向包含4个整型元素的一维数组。P只能指向一维数组。p+1指向下一个一维数组。即指针移动的不是一个元素,而是一行元素。,如:i
11、nt a4; /*a有四个元素,每个都为整型*/ int (*p)4; /*p有四个元素,每个都为整型,p所指的对象是有4个整型元素的数组。*/,因此,这种类型的指针变量与二维数组名的作用相同,若有p=a,则i行j列的元素地址为*(p+i)+j,即 aij与*(*(p+i)+j)等效,2020年8月15日10时9分,工程训练中心 徐国海,int a33=1,2,3,4,5,6,7,8,9,(*p)3; int i=1,j=2; p=a; printf(“%d”,*(*(p+i)+j);,例题一 用指针变量访问二维数组。,2020年8月15日10时9分,工程训练中心 徐国海,例题二 用指针变量求
12、出二维数组中的最大值。,#include void main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12,i,j,(*p)4; int max; p=a; max=*p; for(i=0;imax) max=pij; printf(“%d”,max); ,2020年8月15日10时9分,工程训练中心 徐国海, 字符串的表示形式, 用字符数组存放一个字符串,然后输出该字符串。 #include void main( ) char c=“I have a book!”; printf(“%s”,c); ,c是数组名,它代表数组元素的首地址。 c printf(“%s
13、”,str); ,str,此时定义了一个字符指针变量str,用字符串常量对它进行初始化。C语言对字符串常量按字符数组处理,在内存中开辟一个字符数组用于存放该字符串。对字符指针变量的初始化,实际是把字符串第一个元素的地址赋给str,使得一个字符指针指向一个字符串。 也可以采用下面的方式:,char *str; str=I have a book!;,2020年8月15日10时9分,工程训练中心 徐国海,例题一:用字符指针实现字符串的复制,#include void main( ) char b40, *a=“I have a book!”; char * p1,*p2; p1=a; p2=b;
14、printf(“%s”,p1); while(*p1!=0) *p2=*p1;p1+;p2+; *p2=0; printf(“%s”,b); ,a p1,b p2,2020年8月15日10时9分,工程训练中心 徐国海,区别字符指针变量和字符数组:, 字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址。 定义了字符数组之后,只能对各个数组元素赋值,不能用下面方法对字符数组赋值: char str80; str=“I have a book!”; 而对指针变量,可以采用下面方法赋值: char *a; a=“I have a book”; 赋给a的不是字符,是字符串的首
15、地址。 对字符指针变量赋初值 char *a=“I have a book”等价于 对数组初始化 char str=“I have a book”不等价,char *a; a=“I have a book”;,char str20; error str=“I have a book”,2020年8月15日10时9分,工程训练中心 徐国海, 如果定义一个字符数组c10,它有确定的地址,在编译时为它分配10个字节的连续内存单元。 如果定义一个字符指针变量,则给指针变量分配 2 个字节的内存单元,其中可以存放一个字符变量的地址。 指针变量的值可以改变,而数组名虽代表地址,但它是常量,它的值不可以改变
16、。 用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。,char *format; format=“a=%d,b=%fn”; printf(format ,a,b); printf(“a=%d,b=%dn”,a,b);,2020年8月15日10时9分,工程训练中心 徐国海,例题二:将字符数组a中的ASCII为奇数的字符复制到b数组中去。,#include void main( ) char a=“I am a student”,b20; char *p,*q; p=a; q=b; while(*p!=0) if(*p % 2 !=0) *q=*p; q+; p+; *q
17、=0; printf(“%s”,b); ,2020年8月15日10时9分,工程训练中心 徐国海,指针数组,指针变量可以同其它变量一样作为数组的元素, 由指针变量组成的数组称为指针数组,组成数组的每个元素都是相同类型的指针。 指针数组说明的形式为: 类型名 *数组名常量表达式; 例如: int *p4;,这是定义了一个整型指针数组p,数组元素p0、 p1、 p2、 p3均为指向整型数据的指针。,注意:不要写成 int (*p)4,这是指向整个一维数组的指针变量。,2020年8月15日10时9分,工程训练中心 徐国海,例题三:用指针输出字符串数组,#include void main( ) cha
18、r week=Sun,Mon,Tue,Wed,Thu,Fri,Sat; int i; for(i=0;i7;i+) printf(%sn,weeki); ,#include void main( ) char *str=“I have a book!”; printf(“%s”,str); ,2020年8月15日10时9分,工程训练中心 徐国海,指向指针的指针,使用另一个指针来指向指针数组中的元素,那么这个指针就是指向指针的指针。 定义格式: 类型 *指针变量名 例如: char *p; *p相当于*(*p), (*p)是字符型指针变量, *(*p)是指向字符型指针的指针。 再如: int *
19、p; *p相当于*(*p), (*p)是整型指针变量, *(*p)是指向整型指针的指针。,2020年8月15日10时9分,工程训练中心 徐国海,#include void main( ) int a=1,2,3,4,5,6,7,8,9,10,i; int *num10,*p; for(i=0;i10;i+) numi= ,a,a0,p,num9,num0,a9,a2,a1,2000,num,3000,p,num1,2020年8月15日10时9分,工程训练中心 徐国海,1、分析以下程序运行结果: #include void main() int x, *p; p= ,练习题,10,10,25,2
20、020年8月15日10时9分,工程训练中心 徐国海,3、分析以下程序运行结果: #include void main() int a4=0,1,2,3,*p; p= ,1,0 2 4 6 8 10 12 14 16 18,2020年8月15日10时9分,工程训练中心 徐国海,5、矩阵的转置,1 2 3 4 5 6 7 8 9,1 4 7 2 5 8 3 6 9,6、冒泡法排序,#include main() int a10=2,1,5,3,10,8,68,4,9,11; int i=0,j=0,t=0; clrscr(); for(i=0;iaj+1) t=aj;aj=aj+1;aj+1=t;
21、 for(i=0;i10;i+) printf(%d,ai); ,2020年8月15日10时9分,工程训练中心 徐国海,a1,a7,a0,a1,a2,a3,a4,a5,a6,a7,a8,7、将一数组元素的数值按照逆序重新存放。,2020年8月15日10时9分,工程训练中心 徐国海,#define N 9 #include void main( ) int a9=1,2,3,4,5,6,7,8,9,temp,i,j,m; printf(The original array:n); for(i=0;iN;i+) printf(%5d,ai); printf(n); m=(N-1)/2; for(i
22、=0;i=m;i+) j=N-1-i; temp=ai; ai=aj; aj=temp; printf(The invert array:n); for(i=0;i9;i+) printf(%5d,ai); printf(n); ,数组元素逆序存放,2020年8月15日10时9分,工程训练中心 徐国海,8. 有一n个元素的整型数组。编写程序使前面元素的数值按顺序向后移动m个位置,而后面m个数值变成前面m个数值。,a0,a1,a2,a3,a4,a5,a6,a7,a8,#define N 9 #include void main() int a9=1,2,3,4,5,6,7,8,9,b9,temp
23、,i,j,m=3; printf(The original array:n); for(i=0;i=0;i-) ai+3=ai; for(i=0;i3;i+) ai=bi; printf(The invert array:n); for(i=0;i9;i+) printf(%5d,ai); printf(n); ,2020年8月15日10时9分,工程训练中心 徐国海,#include #include void main() char *q=ab*cde*fg*; char b20,*p; int i,j,len; len=strlen(q); i=0; for(p=q+len-1;*p=*;p-) i+; for(j=0;jlen-i;j+) bj=qj; bj=0; printf(len=%d,i=%d,%s,len,i,b); ,9. 若有字符串“ab*cde*fg*”,删除字符串最后的“*”,删除后的字符串为“ab*cde*fg”。,2020年8月15日10时9分,工程训练中心 徐国海,10. 已知字符串s1和s2,先求其长度,若长度不等,在字符串左侧用“*”补齐,并输出字符串;否则直接输出字符串。,#include #include void main() char *p=abc,*q=bsddsfs
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阑尾炎术后尿潴留的护理干预
- 2024-2025学年冶金工业技能鉴定模拟试题附答案详解(完整版)
- 心力衰竭患者的日常护理要点
- 2025年广东深圳南山外国语学校初三6月质量监测道法试题含答案
- 骨科护理中的跨学科合作新模式
- 2026年湘西州公安局招聘警务辅助人员笔试试题(含答案)
- 安徽省部分学校2026届高三3月联考 历史(二)试卷(含答案详解)
- 2024-2025学年度冶金工业技能鉴定练习题附答案详解【预热题】
- 2024-2025学年度中级软考通关题库含完整答案详解【夺冠】
- 2024-2025学年度注册公用设备工程师高分题库含答案详解(新)
- 充电桩运维服务优化项目完成情况总结汇报
- 2026届高考英语高频固定短语搭配(共1000个)
- 关于中职学生安全教育的课件
- 管理学实战案例分析题及答案解析
- 无人机吊装专项施工方案
- 2026年鄂尔多斯职业学院单招职业技能考试必刷测试卷含答案
- 失能老人照护培训
- 2026年海南软件职业技术学院单招综合素质考试必刷测试卷及答案1套
- 云南省专升本2025年水利水电工程考试水力学重点测试试卷(含答案)
- 2026年二级建造师之二建水利水电实务考试题库300道带答案(培优a卷)
- 高等职业教育专科英语课程标准
评论
0/150
提交评论