《英语考试C语言part指针.pptx》由会员分享,可在线阅读,更多相关《英语考试C语言part指针.pptx(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1英语考试英语考试C语言语言part指针指针n11.3 指针与数组指针与数组n指向数组元素的指针变量指向数组元素的指针变量例例 int array10;int *p;p=&array0;p=array;或或 int *p=&array0;或或 int *p=array;array0array1array2array3array9.整型指针整型指针p&array0p数组名是表示数组首地址的地址常量地址常量第1页/共43页n指针的运算指针的运算n指针变量的赋值运算指针变量的赋值运算np=&a;(将变量将变量a地址地址p)np=array;(将数组将数组array首地址首地址p)np=&arr
2、ayi;(将数组元素地址将数组元素地址p)np1=p2;(指针变量指针变量p2值值p1)n不能把一个整数不能把一个整数p,也不能把也不能把p的值的值整型变量整型变量如如 int i,*p;p=1000;()i=p;()指针变量与其指向的变量具有相同数据类型第2页/共43页n指针变量的算术运算:指针变量的算术运算:np i p i d (i为整型数,为整型数,d为为p指向的变量所占字指向的变量所占字节数节数)np+,p-,p+i,p-i,p+=i,p-=i等等n若若p1与与p2指向同一数组,指向同一数组,p1-p2=两指针间元素个数两指针间元素个数(p1-p2)/dnp1+p2 无意义无意义例例
3、 p指向指向float数,则数,则 p+1 p+1 4例例 p指向指向int型数组,且型数组,且p=&a0;则则p+1 指向指向a1例例 int a10;int *p=&a2;p+;*p=1;例例 int a10;int*p1=&a2;int*p2=&a5;则:则:p2-p1=3;a0a1a2a3a4a5a6a7a8a9a数组数组pp+1,a+1p+i,a+ip+9,a+91第3页/共43页n指针变量的关系运算指针变量的关系运算n若若p1和和p2指向同一数组,则指向同一数组,则np1p2 表示表示p1指的元素在后指的元素在后np1=p2 表示表示p1与与p2指向同一元素指向同一元素n若若p1与
4、与p2不指向同一数组,比较无意义不指向同一数组,比较无意义np=NULL 或或p!=NULL第4页/共43页n数组元素表示方法数组元素表示方法a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)变址运算符ai *(a+i)ai pi *(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9第5页/共43页a0a1a2a3a4例例 数组元素的引用方法数组元素的引用方法main()int a5,*pa,i;for(i=0;i5;i+)ai=i+1;pa=a;f
5、or(i=0;i5;i+)printf(*(pa+%d):%dn,i,*(pa+i);for(i=0;i5;i+)printf(*(a+%d):%dn,i,*(a+i);for(i=0;i5;i+)printf(pa%d:%dn,i,pai);for(i=0;i5;i+)printf(a%d:%dn,i,ai);12345pa第6页/共43页例例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示:数组元素地址的正确表示:(A)&(a+1)(B)a+(C)&p (D)&pi 数组名是数组名是地址常量地址常量p+,p-()a+,a-()a+1,*(a+2)
6、()第7页/共43页例 void main()int a =5,8,7,6,2,7,3;int y,*p=&a1;y=(*-p)+;printf(“%d ”,y);printf(“%d”,a0);输出:输出:5 6pp58762730123456a例例 注意指针变量的运算注意指针变量的运算6第8页/共43页main()int i,*p,a7;p=a;for(i=0;i7;i+)scanf(%d,p+);printf(n);for(i=0;i7;i+,p+)printf(%d,*p);例例 注意指针的当前值注意指针的当前值p=a;pp58762730123456apppppp指针变量可以指到数组
7、后的内存单元第9页/共43页n数组名作函数参数数组名作函数参数n数组名作函数参数,是数组名作函数参数,是“地址地址”传递传递n数组名作函数参数,实参与形参的对应关系数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量第10页/共43页例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723实参与形参均用数组实参与形参均用数组void inv(int x,int n)int t,i,j,m=(n-1)/2;fo
8、r(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()int i,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);printf(The array has been reverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);m=4第11页/共43页例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int *x,int n)int t,*p,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;
9、*j=t;main()int i,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);printf(The array has been reverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);实参用数组实参用数组,形参用指针变量形参用指针变量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma数组60711594723ijijijjiji第12页/共43页例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int*x,int n)int t,*i,*j,*p,m=(n
10、-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;main()int i,a10,*p=a;for(i=0;i10;i+,p+)scanf(%d,p);p=a;inv(p,10);printf(The array has been reverted:n);for(p=a;pa+10;p+)printf(%d,*p);实参与形参均用指针变量实参与形参均用指针变量第13页/共43页例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int x,int n)int t,i,j,m=(n-1)/2;for
11、(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()int i,a10,*p=a;for(i=0;i10;i+,p+)scanf(%d,p);p=a;inv(p,10);printf(The array has been reverted:n);for(p=arr;parr+10;p+)printf(%d,*p);实参用指针变量实参用指针变量,形参用数组形参用数组第14页/共43页n一级指针变量与一维数组的关系一级指针变量与一维数组的关系int *p 与与 int q10 n数组名是指针(地址)数组名是指针(地址)常量常量np=q;p+i 是是qi的地址的地址n
12、数组元素的表示方法数组元素的表示方法:下标法下标法和和指针法指针法,即若即若p=q,则则 pi qi *(p+i)*(q+i)n形参数组形参数组实质上是实质上是指针变量指针变量,即即int q int*qn在定义指针变量(不是形参)时,在定义指针变量(不是形参)时,不能不能把把int *p 写成写成int p;n系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一般一般2字节);而给字节);而给q分配分配2*10字节的内存区字节的内存区小结小结 第15页/共43页 1,写出程序的运行结果写出程序的运行结果.#include void main(void)int a=1
13、,2,3,4,5;int x,y,*p;p=&a0;x=*(p+2);y=*(p+4);printf(“%d,%d,%dn”,*p,x,y);课堂练习课堂练习:第16页/共43页 2,写出程序的运行结果写出程序的运行结果.#include void main(void)int x=1,2,3;int s,i,*p;s=1;p=x;for (i=0;i3;i+)s*=*(p+i);printf(“%dn”,s);课堂练习课堂练习:第17页/共43页n n11.4 指针与字符串指针与字符串指针与字符串指针与字符串n n字符串表示形式字符串表示形式字符串表示形式字符串表示形式n n用字符数组实现用字
14、符数组实现用字符数组实现用字符数组实现例例 main()char string=“I love China!”;printf(“%sn”,string);printf(“%sn”,string+7);IloveChistring0string1string2string3string4string5string6string7string8string9stringstring10string11string12string13n!a0第18页/共43页n用字符指针实现用字符指针实现例例 main()char *string=“I love China!”;printf(“%sn”,strin
15、g);string+=7;while(*string)putchar(string0);string+;IloveChistringn!a0字符指针字符指针初始化初始化:把字符串把字符串首地址首地址赋给赋给stringstring char *string;string=“I love China!”;string*string!=0*stringprintf(“%s”,string)第19页/共43页n n字符串指针作函数参数字符串指针作函数参数字符串指针作函数参数字符串指针作函数参数例例 用函数调用实现字符串复制用函数调用实现字符串复制(1)用字符数组作参数)用字符数组作参数(2)用字符指
16、针变量作参数)用字符指针变量作参数aIamateaceh0r.fromabyuarasutndetoboet.0Iaaeceh0r.t.0mtavoid copy_string(char from,char to)int i=0;while(fromi!=0)toi=fromi;i+;toi=0;main()char a=I am a teacher.;char b=You are a student.;printf(string_a=%sn string_b=%sn,a,b);copy_string(a,b);printf(nstring_a=%snstring_b=%sn,a,b);voi
17、d copy_string(char*from,char *to)for(;*from!=0;from+,to+)*to=*from;*to=0;main()char*a=I am a teacher.;char*b=You are a student.;printf(string_a=%snstring_b=%sn,a,b);copy_string(a,b);printf(nstring_a=%snstring_b=%sn,a,b);第20页/共43页n n字符指针变量与字符数组字符指针变量与字符数组字符指针变量与字符数组字符指针变量与字符数组char *cp;char *cp;与与与与 c
18、har str20;char str20;n nstrstr由若干元素组成,每个元素放一个由若干元素组成,每个元素放一个由若干元素组成,每个元素放一个由若干元素组成,每个元素放一个字符;而字符;而字符;而字符;而cpcp中存放字符串首地址中存放字符串首地址中存放字符串首地址中存放字符串首地址n n char str20;str=char str20;str=“I love China!I love China!”;()char str20=char str20=“I love ChinaI love China”;()char *cp;cp=char *cp;cp=“I love China!
19、I love China!”;()n nstrstr是地址是地址是地址是地址常量常量常量常量;cpcp是地址变量是地址变量是地址变量是地址变量n ncpcp接受键入字符串时接受键入字符串时接受键入字符串时接受键入字符串时,必须必须必须必须先开辟存储先开辟存储先开辟存储先开辟存储空间空间空间空间例例 char str10;scanf(“%s”,str);()而而 char *cp;scanf(“%s”,cp);()改为改为:char *cp,str10;cp=str;scanf(“%s”,cp);()第21页/共43页字符串与数组关系字符串与数组关系字符串与数组关系字符串与数组关系n n字符串用
20、一维字符数组存放字符串用一维字符数组存放字符串用一维字符数组存放字符串用一维字符数组存放n n字符数组具有一维数组的所有特点字符数组具有一维数组的所有特点字符数组具有一维数组的所有特点字符数组具有一维数组的所有特点n n数组名是指向数组首地址的地址数组名是指向数组首地址的地址数组名是指向数组首地址的地址数组名是指向数组首地址的地址常量常量常量常量n n数组元素的引用方法可用指针法数组元素的引用方法可用指针法数组元素的引用方法可用指针法数组元素的引用方法可用指针法和下标法和下标法和下标法和下标法n n数组名作函数参数是地址传递等数组名作函数参数是地址传递等数组名作函数参数是地址传递等数组名作函数
21、参数是地址传递等n n区别区别区别区别n n存储格式:字符串结束标志存储格式:字符串结束标志存储格式:字符串结束标志存储格式:字符串结束标志n n赋值方式与初始化赋值方式与初始化赋值方式与初始化赋值方式与初始化n n输入输出方式:输入输出方式:输入输出方式:输入输出方式:%s%cs%cchar str=“Hello!”;()char str=“Hello!”;()char str=H,e,l,l,o,!;()char *cp=“Hello”;()int a=1,2,3,4,5;()int *p=1,2,3,4,5;()char str10,*cp;int a10,*p;str=“Hello”;
22、()cp=“Hello!”;()a=1,2,3,4,5;()p=1,2,3,4,5;()scanf(“%s”,str);printf(“%s”,str);gets(str);puts(str);第22页/共43页n n11.5 指针与函数指针与函数指针与函数指针与函数n n函数指针:函数在编译时被分配的入口地址函数指针:函数在编译时被分配的入口地址函数指针:函数在编译时被分配的入口地址函数指针:函数在编译时被分配的入口地址,用函数名表用函数名表用函数名表用函数名表示示示示max.指令1指令2n函数指针变量赋值函数指针变量赋值:如如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值
23、类型相同的不同函数n指向函数的指针变量指向函数的指针变量n定义形式:定义形式:数据类型数据类型 (*指针变量名指针变量名)();如如 int (*p)();函数指针变量指向的函数必须有函数说明n函数调用形式:函数调用形式:c=max(a,b);c=(*p)(a,b);n对函数指针变量对函数指针变量p n,p+,p-无意义无意义()不能省int(*p)()与 int *p()不同第23页/共43页例例 用函数指针变量调用函数,比较两个数大小用函数指针变量调用函数,比较两个数大小main()int max(int,int);int a,b,c;scanf(%d,%d,&a,&b);c=max(a,
24、b);printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);main()int max(int,int),(*p)();int a,b,c;p=max;scanf(%d,%d,&a,&b);c=(*p)(a,b);printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y)int z;if(xy)z=x;else z=y;return(z);第24页/共43页n n用函数指针变量作函数参数用函数指针变量作函数参数用函数指针变量作函数
25、参数用函数指针变量作函数参数例例 用函数指针变量作参数,求最大值、最小值和两数之和用函数指针变量作参数,求最大值、最小值和两数之和void main()int a,b,max(int,int),min(int,int),add(int,int);void process(int,int,int(*fun)();scanf(%d,%d,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);void process(int x,int y,int(*fun)()int result;result=(*fun)(x,y);printf(%
26、dn,result);max(int x,int y)printf(printf(“max=max=”););return(xy?x:y);return(xy?x:y);min(int x,int y)printf(printf(“min=min=”););return(xy?x:y);return(x*y)return x;elsereturn y;main()int a=2,b=3;int*p;p=f1(&a,&b);printf(%dn,*p);.20002008200A20022004200623 指针变量y 指针变量x(f1)20022000COPY变量a 变量b(main)指针变量
27、p*第27页/共43页例例 写一个函数,求两个写一个函数,求两个int型变量中含有较大值的变量的地址型变量中含有较大值的变量的地址.20002008200A2002200420062变量a 变量b(main)3 指针变量p*2002int*f1(int*x,int*y)if(*x*y)return x;elsereturn y;main()int a=2,b=3;int*p;p=f1(&a,&b);printf(%dn,*p);第28页/共43页n n11.711.7 指针数组和多级指针指针数组和多级指针指针数组和多级指针指针数组和多级指针用于处理二维数组或多个字符串用于处理二维数组或多个字符
28、串用于处理二维数组或多个字符串用于处理二维数组或多个字符串n n指针数组指针数组指针数组指针数组n n定义:数组中的元素为指针变量定义:数组中的元素为指针变量定义:数组中的元素为指针变量定义:数组中的元素为指针变量n n定义形式:定义形式:定义形式:定义形式:存储类型存储类型存储类型存储类型 数据类型数据类型数据类型数据类型 *数组名数组名数组名数组名 数组长度说明数组长度说明数组长度说明数组长度说明;例例例例 int *p4;int *p4;指针所指向变量的数据类型指针本身的存储类型n指针数组赋值与初始化指针数组赋值与初始化赋值:main()int b23,*pb2;pb0=b0;pb1=b
29、1;.int *pb2pb0pb1int b23123246第29页/共43页n指针数组赋值与初始化指针数组赋值与初始化赋值赋值:main()char a=Fortran;char b=Lisp;char c=Basic;char*p4;p0=a;p1=b;p2=c;p3=NULL;.或或:main()char*p4;p0=Fortran;p1=Lisp;p2=Basic;p3=NULL;.初始化初始化:main()char*p=Fortran,Lisp,Basic,NULL;.L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30第30页/共43页n n多级
30、指针多级指针多级指针多级指针n n定义定义定义定义:指向指针的指针指向指针的指针指向指针的指针指向指针的指针n n一级指针一级指针一级指针一级指针:指针变量中存放目标变量的指针变量中存放目标变量的指针变量中存放目标变量的指针变量中存放目标变量的地址地址地址地址p1&p2&i3P2(指针变量)i(整型变量)例 int *p1;int *p2;int i=3;p2=&i;p1=&p2;*p1=5;n二级指针二级指针:指针变量中存放一级指针变量的地址指针变量中存放一级指针变量的地址例 int *p;int i=3;p=&i;*p=5;&i3P(指针变量)i(整型变量)一级指针单级间接寻址二级指针一级
31、指针目标变量二级间接寻址第31页/共43页n定义形式:定义形式:存储类型存储类型 数据类型数据类型 *指针名;指针名;如如 char *p;例例 int i,*p;p=&i;()p是二级指针,不能用变量地址为其赋值是二级指针,不能用变量地址为其赋值指针本身的存储类型最终目标变量的数据类型*p是p间接指向对象的地址*p是p间接指向对象的值例 int i=3;int *p1;int *p2;p1=&i;p2=&p1;*p2=5;ip1p23&i&p1*p2,*p1*p2n多级指针多级指针例例 三级指针三级指针 int *p;四级指针四级指针 char *p;第32页/共43页n n命令行参数命令行
32、参数命令行参数命令行参数n n命令行:在操作系统状态下,为执行命令行:在操作系统状态下,为执行命令行:在操作系统状态下,为执行命令行:在操作系统状态下,为执行某个程序而键入的一行字符某个程序而键入的一行字符某个程序而键入的一行字符某个程序而键入的一行字符n n命令行一般形式:命令行一般形式:命令行一般形式:命令行一般形式:命令名命令名命令名命令名 参数参数参数参数1 1 参参参参数数数数2 2参数参数参数参数n nmain(int argc,char *argv)n命令行参数传递命令行参数传递n带参数的带参数的main函数形式:函数形式:C:TC copy.exe source.c temp.
33、c有3个字符串参数的命令行命令行中参数个数元素指向命令行参数中各字符串首地址形参名任意命令行实参main(形参)系统自动调用main函数时传递第一个参数:main所在的可执行文件名可执行文件名第33页/共43页例例 输出命令行参数输出命令行参数/*test.c*/main(int argc,char*argv)while(argc1)+argv;printf(%sn,*argv);-argc;main(int argc,char *argv)while(argc-0)printf(%sn,*argv+);1.编译、链接test.c,生成可执行文件test.exe2.在DOS状态下运行(test
34、.exe所在路径下)例如:C:TC test.exe hello world!运行结果:hello world!运行结果:C:TCTEST.exe hello world!argv0argv1argv2char*argv worldtesthelloargvargc=3第34页/共43页定义定义含义含义int i;int *p;int an;int *pn;int (*p)n;int f();int*p();int(*p)();int*p;定义整型变量定义整型变量ip为指向整型数据的指针变量为指向整型数据的指针变量定义含定义含n个元素的整型数组个元素的整型数组an个指向整型数据的指针变量组成的
35、指针数组个指向整型数据的指针变量组成的指针数组pp为指向含为指向含n个元素的一维整型数组的指针变量个元素的一维整型数组的指针变量f为返回整型数的函数为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量为指针变量,它指向一个指向整型数据的指针变量指针的数据类型第35页/共43页 1,写出程序的运行结果写出程序的运行结果.#include void main(void)char a=“fprogram”,b=“fortran”;
36、char*p,*q;p=a;q=b;while (*p&*q)if(*p=*q)printf(“The letter:%cn”,*q);p+;q+;课堂练习课堂练习:第36页/共43页 2,写出程序的运行结果写出程序的运行结果.#include void main(void)int a=2,*p,*pp;pp=&p;p=&a;a+;printf(“%d,%d,%dn”,a,*p,*pp);课堂练习课堂练习:第37页/共43页 3,从键盘输入一行字符从键盘输入一行字符,存入字符数组中存入字符数组中,然后输出该字然后输出该字符串符串,请填写程序缺少的部分请填写程序缺少的部分.#include vo
37、id main(void)char str80,*p;int i;for (i=0;i80;i+)stri=getchar();if(stri=n)break;stri=_;p=_;while(*p)putchar(*p_);课堂练习课堂练习:第38页/共43页选择排序的选择排序的基本思想基本思想:把把要要排排序序的的数数分分为为两两部部分分,一一部部分分已已排排好好序序;另另一一部部分分是是还还没没有有排排好好序序.从从还还没没有有排排好好序序的的数数中中选选出出最最小小的的一一个个数数,把把这这个个数数加加入入到到已已排排好好序序的的数数的的最最后后.如如此此下下去去,直直到到不不存存在在
38、没没有有排排好序的数为止好序的数为止.至此至此,排序完成排序完成.算法总结算法总结:排序排序 例:用选择排序法,对输入的例:用选择排序法,对输入的10个数进行从小到大排序个数进行从小到大排序第39页/共43页#include void main(void)int a10,i,j,temp1,t2;.for(i=0;i9;i+)temp1=ai;for(j=i+1;jaj)t2=temp1;temp1=aj;aj=t2;ai=temp1;.算法总结算法总结:排序排序 第40页/共43页#include void main(void)int loop;int test=23,43,11,65;in
39、t *p=test;/*1,使用使用数组名数组名加加下标下标方法访问数组方法访问数组*/for(loop=0;loop=3;loop+)printf(“test%d=%dn”,loop,testloop);/*2,使用使用数组名数组名加加偏移量偏移量方法访问数组方法访问数组*/for(loop=0;loop=3;loop+)printf(“*(test+%d)=%dn”,loop,*(test+loop);举例举例:四种访问数组的方法四种访问数组的方法 第41页/共43页/*3,使用使用指针指针加加下标下标方法访问数组方法访问数组*/for(loop=0;loop=3;loop+)printf(“p%d=%dn”,loop,ploop);/*4,使用使用指针指针加加偏移量偏移量方法访问数组方法访问数组*/for(loop=0;loop=3;loop+)printf(“*(p+%d)=%dn”,loop,*(p+loop);作业作业:10.3,10.8举例举例:四种访问数组的方法四种访问数组的方法 第42页/共43页
限制150内