版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/8/13,1,第10章指 针,指针是C语言的一个重要特色。掌握指针的应用,会使C语言程序简洁、紧凑和高效。 利用指针直接处理内存地址,是C有别于其它高级语言的关键。 只有掌握和运用好指针,才真正掌握了C语言的精华。,2020/8/13,2,本章主要内容: 10.1 变量的地址和指针变量的概念 10.2 指针变量的定义、赋值和引用 10.3 指针变量的运算 10.4 指针变量作函数参数 10.5 指针和数组的关系 10.6 指针和函数 10.7 指针数组 10.8 命令行参数,2020/8/13,3,10.1 变量的地址 和指针变量的概念,3,6,7,8,15,16,A公司,B公司,C
2、公司,一排平房,叫地址,2020/8/13,4,1000,int a;,float b;,内存管理,1001,2002,2003,2000,2001,a的地址,b的地址,说明:,变量a的地址记作 int *point=,2020/8/13,7,变量的指针就是变量的地址。存放这个指针的变量叫指针变量。 指针变量是一种特殊的变量。它的特殊性表现在: 因为指针变量是用来存放某个变量的地址值的,因此指针变量的值与一般变量的值是不同的。(当然指针变量所存放地址值的那个变量应是已经定义过的。)一个指针变量存放了哪个变量的地址,就说该指针变量指向了那个变量。简而言之,指针变量的值是地址值。,2020/8/1
3、3,8,指针变量的类型是该指针变量所指向的变量的类型,而不是指针变量本身的类型。(指针本身是内存地址值,其类型是int 型或long型。)由于指针变量可以指向任何一种类型的变量,因此,指针变量的类型可以是C语言允许的任何一种数据类型,例如,int 型、char型、float型、数组类型、结构类型、联合类型,还可以指向函数、文件和指针等。 简而言之,指针变量的类型是它所指向的变量的类型。 为什么要定义指针类型?为了指针运算。,2020/8/13,9,10.2 指针变量的定义和引用,一、指针变量的定义 定义形式: 存储类型 数据类型 *指针变量名; int i,*p1 , *p2 ; static
4、 char c,*pc1 , *pc2 ; float f,*pf1 , *pf2 ; p1=,2020/8/13,10,二、 指针变量的赋值,不论是赋初值还是赋值,对一般的指针变量都是赋予一个相应类型变量的地址。例如: int x,*p=,说明: (1)指针变量只有赋值后才能使用。使用没有被赋值的指针变量会很危险,有可能造成系统瘫痪。 (2)给指针变量赋值时, 一定要注意类型的一致。,2020/8/13,11,(3)可将一个已赋值的指针变量赋给另一个同类型的指针变量。 例如:int a,*p,*q; p=,2000,2000,(4)暂时不用的指针变量可以赋值NULL(空指针)。,2020/8
5、/13,12,三、 指针变量的引用,指针变量的值就是它所指向变量的地址值,而指针变量所指向的变量的值就是指针变量所存放地址的那个变量的值。 例如:int a=5,*p= p的值为变量a的地址值,而p所指向变量的值是a的值5。 在执行语句中,用于指针操作的两个运算符: p= i、j、k的关系?,因此,变量的值可以直接地用变量来表示,也可以间接地用指向该变量的指针变量来表示用*运算符。 ,int *p;,p=,*p=5;,printf(%d,a);,a,p,int *p;,p=,*p=5;,a,p,5,若已有:int *w;,w,要使w也指向a,应如何操作?,w=,或w=p;,2020/8/13,
6、16,请思考:,int a;,int *p;,w=p=,*p=5;,a,p,5,int *w;,w,要使a的值增1,应如何操作?,a=a+1;,或*p=*p+1;,或*w=*w+1;,2020/8/13,17,int a;,int *p;,w=p=,*p=5;,a,p,5,int *w;,w,a=a+1;,或*p=*p+1;,或*w=*w+1;,等价于int *p,*w;,间接运算符,取地址运算符,直接存取,间接存取,2020/8/13,18,【例10.2】给指针变量赋值示例,main( ) float a,b=6.0,*p,*q; p= ,6.0,a,b,q,p,float a,b=6.0,
7、*p,*q;,p=,*p,scanf(%f,p);,1.0,1.0,*p=*p+2;,3.0,q=p;,*q,p=,*p,printf(%f,%f,*q,*p);,输出:3.000000,6.000000,2020/8/13,19,【例10.3】非法使用指针示例。 #include main( ) int *p,a=1; float *q; *p=5; q= , p没有确定的指向, q只能指向float型变量,p=NULL;,显示错误信息,空指针,2020/8/13,20,例:输入两个整数,按大小顺序输出。 #include void main( ) int a,b,temp,*p1= ,2,
8、2,6,此处交换的是指针变量所指向的变量的值。,/ 6,2,,2020/8/13,21,例:输入两个整数,按大小顺序输出。 #include void main( ) int a,b,*temp,*p1,*p2; p1= ,3000,3000,3010,此处交换的是指针变量的值,a、b的值并没有交换。,/ ,,2020/8/13,22,10.3 指针变量的运算,指针变量可以进行下列4种运算: 赋值、 指针加减整数、 两个指针相减、 两个指针比较。 一、指针的赋值运算(同前) 二、指针的加减整数运算 一个指针可以加上或减去一定范围内的一个整数,以此来改变指针的地址值,通常用于连续分配的整块空间。
9、如数组等。,2020/8/13,23,注意:指针p加i(p+=i;)不是简单地将p的值加i,而是将p的值加上i倍的它所指向的变量占用内存的字节数。 对于int型变量, p+=i实际上是p+=4*i; 对于float型变量,p+=i实际上是p+=4*i。 以此类推。因此尽管指针运算是对地址进行运算,但又不完全雷同于地址运算。地址加1绝对地址加1。,int a10,*p=a;/p指向数组a的首地址。,区别: i=*p+; p=a; i=(*p)+; i=+*p; i=*+p;,/ i=7 p指向a1,/ i=7,/ i=9,/ i=18,2020/8/13,24,例: 分析指针加1和地址加1的区别
10、。(sam4.cpp) (p是一个指针变量,p+1指针加1,(int)p+1地址加1)。 #include void main( ) char c,*cp1= ,结果:1,1,1 1,4,8,2020/8/13,25,三、两个指针相减运算,在一个连续存储空间里,两个指针可以相减。其结果是两指针之间包含数据的个数。对不连续存储的数据,其地址毫无关联,相减亦无意义。 例如:指向同一数组的两个不同元素的指针相减,则表示两个指针相隔元素的个数。,2020/8/13,26,#include void main( ) int i; char s =abc def; char *p1,*p2; ,i=0;
11、p1=p2=s; while(si+!=0) p2+; printf(%dn,p2-p1);,例:计算已知字符串的长度。,/samp2 结果:7,2020/8/13,27,四、两个指针的比较运算,指针可以做 、=、=、= =、!=比较运算。 例: 把一个字符串中的字符逆序输出。,void main() char s =“abcdefgh”,*p; for( p=s+strlen(s)-1 ; p!=s-1 ; p-) printf(%c,*p); printf(n); ,2020/8/13,28,10.4 指针变量作函数参数,指针变量可以作为函数的形参和实参传址调用。 若将存放变量的地址传给被
12、调函数,被调函数的形参必须是指针型变量。 在被调函数中可以通过间接访问的方式得到或修改实参的内容。 这种方法使数据传输安全可靠,而且可以实现多个数据的双向传递。,2020/8/13,29,2020/8/13,30,main( ) swap( ,2020/8/13,31,函数间数据“双向”传递:主函数调用opr函数,在opr中求出两个整数i和j的和与差,并把和与差保存在实参内容里。,void opr( int, int, int*, int*); void main( ) int i=5,j=3, k1, k2; opr(i,j, ,8,2,2020/8/13,32,函数间数据“双向”传递的方法
13、:,(1)返回值方式,但只能返回一个值。 (2)传址调用,可以传递多个值,而且安全。 (3)使用全局变量,可以传递多个值,但是不安全。,2020/8/13,33,10.5 指针和数组的关系,一维数组名表示数组的首地址。 (或用,p? *p? p+5? p+? p-? p=a+3? a? *a? int i=0 ;k=0; while( si!=0) k+; i+; printf(The string length is %dn,k ); ,while( *(s+i)!=0) k+; i+;,while(*p!=0) k+; p+;,比较si、*(s+i)和*p三种访问数组元素方法的运行效率,,
14、/结果:7,前两种相同,第三种要快,因为指针每次直接指向元素,不必每次重新计算元素地址。,2020/8/13,37,10.5.2 一维数组名作参数,实参是一维数组名,即一维数组的首地址。形参应为与实参数组同数据类型的数组或指针变量。,main( ) float array10; farray(array,10); ,farray(float tarray ,int n) ,或:farray(float *pt,int n) ,main( ) float array10; float *p=a; farray( p,10); ,2020/8/13,38,实参、形参有以下4种对应关系:,(1)形参
15、、实参数组名; (2)实参数组名,形参指针变量; (3)实参指针变量,形参数组名; (4)实参、形参指针变量,2020/8/13,39,例:将数组a中的整数按相反顺序存放。,void inv (int x ,int n) int temp ,i=0 , j ,m=(n-1)/2; for ( ;i=m ; i+) j=n-1-i; temp=xi ; xi=xj ; xj=temp; ,void main( ) int a10, i=0 ; for ( ; i10;i+) scanf(“%d”, ,2020/8/13,40,void main( ) int a10, i=0 ,*p=a; fo
16、r ( ; i10;i+,p+) scanf(“%d”,p); inv( a,10); for ( p=a ; pa+10;p+) printf(“%4d”,*p); printf(“n”); ,例:将数组a中的整数按相反顺序存放。,void inv (int *x ,int n) int temp ,*i , *j ,*p , m=(n-1)/2; i=x ; j=x+n-1 ; p=x+m; for ( ;i=p ; i+,j-) temp=*i ; *i=*j ; *j=temp; ,inv(p,10);,p=a ; inv(p,10);,2020/8/13,41,10.5.3 指向字符
17、串的指针,定义字符指针char *p;就可以利用指针访问字符串。 char s =“String”;定义并初始化字符数组。 char *p=“String”;定义字符指针p,系统开辟7字节的空间存放String0,并将这块空间的首地址放到p中。它等同于char *p; p=”String”; 可以用*p或pi来访问某个字符元素,或用puts(p)、printf(“%s”,p)等方式输出字符串。 但是char s10; s=“String”;却是错误的。,2020/8/13,42,void str-copy(char from ,char to ) int i=0 ; while (formi!
18、=0) toi=formi;i+; toi=0; void main( ) char a20,b20; gets(a); gets(b); printf(“string a=%sn string b=%sn”,a,b); str-copy(a,b); printf(“string a=%sn string b=%sn”,a,b); ,void str-copy(char *from,char *to) for ( ;*form!=0;form+;to+) *to=*form; *to=0; ,例:字符串复制。,void str-copy(char *from,char *to) while (
19、*form!=0) *to+=*form+; *to=0; ,void str-copy(char *from,char *to) while(*to=*form )!=0) form+; to+; ,void str-copy(char *from,char *to) while(*to+=*form+ )!=0); ,void str-copy(char *from,char *to) while(*to+=*form+ ); ,void str-copy(char *from,char *to) for ( ; *to+=*form+ ; ); ,void str-copy(char f
20、rom ,char to ) char *f=form , *t=to ; while(*t+=*f+ )!=0); ,2020/8/13,43,10.6 指针和函数,10.6.1指针型函数返回值为指针变量的函数 定义格式:数据类型 *函数名(形参表) 在调用这个函数时,接收函数返回值的也应是个指针型变量。,例:统计若干学生的成绩,要求输入、输出在主函数中完成,统计学生成绩用指针函数完成。,2020/8/13,44,#include float *mysum( float *x, int n) float sum=0 ,*pt= ,2020/8/13,45,10.6.2 指向函数的指针,定义格
21、式: 数据类型 (*指针变量名) ( ); 如:int (*pf)( ); pf是一个指向函数的指针变量,它所指向的函数是个整型函数。 指针变量可以指向变量,也可以指向函数指向函数程序段的入口地址。有了该指针变量,我们可以利用它来调用函数。 对指向函数的指针变量作加减运算是没有意义的。如pf+n,pf+,-pf,2020/8/13,46,指向函数的指针变量的使用如下:,(1)把一个函数名赋给指向函数的指针变量,该指针变量就指向那个函数的入口地址。如:pf=max; max是函数名。 (2)用指向函数的指针调用函数。 (*指针名)(实参表列);,例如: int max(int,int); int
22、 (*pf)( ); int a,b,mm; pf=max; /只写函数名,不写()和参数。 mm=(*pf)(a,b); /等价于mm=max(a,b);,2020/8/13,47,10.6.3 指向函数的指针变量作函数参数,指向函数的指针变量通常作函数的参数。当函数的形参为指向函数的指针时,实参要用函数名,实现函数地址的传递。,void fun(double y,double (*f)( ) printf(“%2.1fn”,(*f)(y); main( ) double sin( ),cos( ),tan( ); double x; int a; printf(“Input a:”); s
23、canf(“%d”, ,2020/8/13,48,10.7 指针数组,10.7.1 指针数组 指针数组指数组的类型是指针,即数组元素为指针变量。 定义格式:数据类型 * 数组名长度; 如:int *p4; 主要用于处理若干字符串。定义一个字符指针数组比定义一个二维字符数组在空间上更节省,执行速度更快。 例:将若干字符串按字母顺序(由小到大)输出。 char *name =“Follow me”, “BASIC”, “ Great wall”, “FORTRAN”, “Computer Design”;,2020/8/13,49,void sort(char *name ,int n) char
24、 *temp; int i,j,k; for(i=0;i0 ) k=j; if(k!=i) temp=namei;namei=namek;namek=temp; void print(char *name ,int n) for(int i=0;in;i+) printf(“%sn”,namei); void main( ) char *name =“Follow me”,”BASIC”,”Great wall”,”FORTRAN”,”Computer Design”; int n=5; sort(name,n); print(name,n); /ex9-8,if ( *namek *name
25、j ) k=j ;,2020/8/13,50,10.7.2 指向指针的指针变量(二级指针),void print(char *name ,int n) char *p; for(int i=0; in; i+) p=name+i; printf(“%sn”,*p); ,定义格式:数据类型 *变量名;,char *p=name; for(int i=0; in; i+,p+) printf(“%sn”,*p); ,2020/8/13,51,10.8 命令行参数,当执行C程序时,程序名后还可跟有参数,称为命令行参数。 如:程序名 参数1 参数2 参数n 这时要求主函数main( )必须带形参。 void main(int argc,char *argv ) argc的值为程序名+参数个数;即参数个数+1。 argv是一个字符指针数组,它把程序名和所有参数以字符串形式保存其中。 main函数是由系统调用的,那么main函数的形参值从何处得到呢?实际上实参是和程序名一起给出的。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江西昌华路建设咨询监理有限公司招聘备考题库附参考答案详解ab卷
- 2026广东广州市招聘中山医学院医科公共平台技术员1人备考题库附参考答案详解ab卷
- 2026-2027广东佛山南海区石门高级中学招聘教师188人备考题库(第三场)附完整答案详解【名校卷】
- 2026中国人民财产保险股份有限公司那曲分公司嘉黎县营销服务部招聘1人备考题库带答案详解(研优卷)
- 2026广东佛山高明技师学院、佛山市高明区职业技术学校招聘事业编制教师8人备考题库及完整答案详解(考点梳理)
- 2026湖南怀化市芷江侗族自治县安置政策城镇退役士兵竞聘招录5人备考题库及参考答案详解【夺分金卷】
- 2026恒丰银行杭州分行社会招聘20人备考题库附答案详解(模拟题)
- 2026广东深圳市优才人力资源有限公司公开招聘聘员(派遣至龙城街道)18人备考题库及完整答案详解【有一套】
- 2026陕西延安北方医院招聘备考题库附答案详解【b卷】
- 2026新教材人教版二年级下册数学 第7课时 根据问题补充条件 课件
- 2025年短视频平台海外市场拓展报告
- TCSES88-2023建设项目竣工环境保护设施验收技术规范污染影响类总则
- 行政岗位任职资格分级标准详解
- 2026年山西工程职业学院单招职业技能考试题库及答案解析(名师系列)
- 地震勘探资料解释技术
- 2025年校园节能改造项目可行性研究报告及总结分析
- 运动品牌361°小刘鸭联名新品发布快闪店活动方案
- 2025秋南方新课堂金牌学案中国历史七年级上册(配人教版)(教师用书)
- 劳动关系协调员四级考试真题(2篇)
- 2025年ODCC开放数据中心大会:云边协同AI网络技术白皮书
- 2025年中国纳米功能电池项目创业计划书
评论
0/150
提交评论