




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章指针指针是C语言中的重要概念,也是C语言的重要特色。使用指针,可以使程序更加简洁、紧凑、高效。§10.1指针的概念一.内存单元的内容、内存单元地址:
内存区域划分为一个一个的内存单元,一个内存单元可以存放一字节数据,每一个内存单元都有一个地址。
例:inti=3;
charj=‘s’;
变量i变量j编译时为变量i分配2000和2001两个字节的内存单元,为j分配2003一个字节的内存单元200220043000200020012003地址752003内存单元通常把内存单元的地址称为指针.指针变量j-pointer3二.内存单元的访问:直接访问:通过变量名访问。
charj=‘s’;
printf(“%c”,j);间接访问:通过该变量的指针来访问。
p=&j;
称:指针变量p指向变量j,是变量j的指针。752000j752000jp指针(pointer):是一个变量的地址,
是常量。指针变量:是指取值为地址的变量,其值是另一个变量的地址。
要引用指针,必须定义指针。定义指针,是为了通过指针访问内存单元。一个数组或函数占有一段连续内存单元,假如将一个数组或函数的首地址赋给指针变量,通过指针就可以找到数组或函数。
§10.2变量的指针一、指针变量的定义
类型标识符
*标识符 例如:int*cm“标识符”是指针变量名“*”表示定义指针变量
“类型标识符”表示该指针变量所指向的变量类型。指针是一个变量的地址,为了表示指针与它指向变量的地址之间的关系,用*表示指向.
二、指针变量的引用未经赋值的指针变量不能用。指针变量只能赋予地址。
C语言提供两种相关地址运算符:
&:取地址运算符
*:取内容运算符
*\&优先级相同.例:
inta=5,b;
int*p;p=&a;b=*p;
类型说明中的*表示定义指针变量表达式中的*是运算符52000a2002b......3000p2000&a&a5pa三、指针变量的赋值:(1)、inta,*pa;
pa=&a;(2)、inta=5,*p=&a;(3)、inta,*pa=&a,*pb;
pb=pa;(4)、inta[5],*pa;pa=a;
(5)、char*pc;
pc=“clanguage”;
/*整型变量a的地址赋给指针变量pa*//*指针变量p取得整型变量a的地址.*//*指针pa的值赋给指针pb*//*将数组的首地址赋给相同类型的指针*//*将字符串的首地址赋给指针变量*/[例10.1]
main(){inta,b;
int*pointer_1,*pointer_2;/*定义指针变量*/a=100;b=10;pointer_1=&a;pointer_2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1,*pointer_2);}程序运行结果:&a&b10010pointer-1pointer-2ab
100,10100,10
[例10.2]
输入a和b两个整数,按先大后小的顺序输出a和b。
See:9_2.cmain(){int
*p1,*p2,*p,a,b;
scanf("%d,%d",&a,&b);
p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*p1,*p2);}
运行:5,9&a5p1a&b9p2bp
a=5,b=9;max=9,min=5该例不交换变量a、b的值,而是交换指针p1、p2的值。&b&a四、指针变量作为函数的参数
[例10.3]
题目要求同[例10.2],输入a和b两个整数,按先大后小的顺序输出a和b。swap(int*p1,int*p2)/*交换指针p1、p2所指向的变量的值*/{intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;
int*pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);
printf("\n%d,%d\n",a,b);}把变量a和b的地址传送给形参§10.3数组的指针指针可以指向数组和数组元素,对数组元素的访问:
既可以使用数组下标,也可以使用指针.一、指向数组元素的指针变量指向数组元素的指针变量,其类型应与数组元素相同.例1:
inta[7];
int*pa;
pa=&a[0];
或pa=a;
例2:floatb[10],*pb=b;
或floatb[10],pb=&b[0];
1234567&a[0]paa[0]a[6]二、通过指针引用数组元素
设:inta[10],*p=&a[0];(1).p+1和a+1指向下一个元素a[1];
如果数组元素是整型,p+1表示p的地址加2;如果数组元素是实型,p+1表示p的地址加4;
p+i和a+i指向元素a[i]。(2).*(p+i)和*(a+i)访问元素a[i];
例:*(p+5)和*(a+5)与a[5]等效;(3).指向数组指针可以带下标:
例:p[i]与*(p+i)等效.[例10.5]
输出数组的全部元素。(设10个元素,整型)。访问各元素有三种方法:
1、下标法(常用,很直观)
main(){
inta[10];
inti;for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");for(i=0;i<10;i++)
printf("%d",a[i]);}2、用数组名计算数组元素的地址。(效率与下标法相同,常用)
main(){
inta[10];
inti;for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");for(i=0;i<10;i++)
printf("%d",*(a+i));}特点:不移动指针3、用指针访问各元素。(常用,效率高)
main()(see:9_5.c){
inta[10];
int*p,i;for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");for(p=a;p<(a+10);p++)
/*p++使p指向下一个元素*/
printf("%d",*p);}特点:移动执针例:通过以下程序输出a数组中的10个元素。
main(){
inta[10],*p,i; p=a; for(i=0;i<10;i++)
scanf("%d",p++);
printf("\n"); for(i=0;i<10;i++,p++)
printf("%d\t",*p);}??请问大家:以上程序可以输出a数组中的10个元素吗?
三、数组名作函数参数
1、形参和实参都用数组名例:main(){intarray[10];…f(array,10);…}f(int
arr[],intn){…}例:main(){intarray[10];…f(array,10);…}f(int*arr,intn){…}2、实参用数组名,形参用指针变量。例:main(){intarray[10],*p;p=array;…f(p,10);…}f(int*arr,intn){…}3、实参、形参都用指针变量。例:main(){intarray[10],*p;p=array;…f(p,10);…}f(int
arr[],intn){…}4、实参用指针变量,形参用数组名。实际上,c编译系统将形参数组名作为指针变量处理.
若有定义:f(int
arr[],intn)
编译后:f(int*arr,intn)§10.4字符串的指针一、字符串的表现形式
C语言中,有两种方式可以实现字符串:字符数组、字符指针。
[例10.16]:字符数组
main(){charstring[]={"IloveChina!”};
printf("%s\n",string);}string是数组名,代表字符数组的首地址。数组可以用下标访问,也可以用指针访问用字符串对字符数组赋值[例10.17]字符指针
main(){char*name1=”Mary";char*name2=“Hare”;
printf("%s%s\n",name1,name2);}name1是一个指针变量
char*name1=“Mary”;等价于:char*name1;
name1=”Mary";它把字符串常量的首地址赋给指针1name2MaryHare[例10.18]
将字符串a复制到字符串b。main(){chara[]="Iamaboy.";charb[20];
inti;
for(i=0;*(a+i)!='\0';i++)*(b+i)=*(a+i);
*(b+i)='\0';
printf("stringais:%s\n",a);
printf("stringbis:");
for(i=0;b[i]!='\0';i++)
printf("%c",b[i]);
printf("\n");}Iam数组aaaboy.\0数组bb用数组名计算数组元素的地址特点:不移动指针[例10.19]:用指针处理字串复制.main(){chara[]="Iamaboy.",b[20],*p1,*p2;
inti;p1=a;p2=b;
for(;*p1!='\0';p1++,p2++)
*p2=*p1;*p2='\0';
printf("stringais:%s\n",a);
printf("stringbis:");
for(i=0;b[i]!='\0';i++)
printf("%c",b[i]);
printf("\n");}Iam数组ap1aboy.\0数组bp2特点:移动执针Iamaboy.\0例10.21:main(){char*a=“Ilovechina!”;
a=a+7;
printf(“%s”,a);}运行结果如下:China!(a+7)是用指针指向数组元素a[i]的第7个字符§10.5函数指针
一、用函数指针变量调用函数函数指针定义的一般形式:
函数返回值类型(*指针变量名)()
例:int(*p)()说明:(*p)()表示定义一个指向函数的指针变量,它不固定指向哪一个函数,它是专门用来存放函数的入口地址的,该函数返回一个整型值.。C规定:函数的名称就是函数的入口地址[例9.23]
求a和b中的大者。用函数名调用函数max()int
max(intx,inty);/*原型*/{intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);}
用函数指针调用函数max()int
max(intx,inty)/*原型*/{intz;if(x>y)z=x;elsez=y;returnz;}main(){int(*p)();/*定义函数指针p*/
inta,b,c;p=max;/*函数max的入口地址赋给函数指针p*/
scanf("%d,%d",&a,&b);c=(*p)(a,b);/*用函数指针p调用函数*/
printf("a=%d,b=%d,max=%d",a,b,c);}用函数指针变量调用函数时,只须将(*p)代替函数名max,并加上实参§10.6返回指针的函数(自学)一般形式:
类型标识符*函数名(参数表)例、
int*a(intx,inty)声明一个函数,函数名为a,其返回值类型是“指向整型的指针”,函数形式参数为intx和inty。注意:在a的两侧分别为*运算符和()运算符,a先与()结合,这是函数形式;函数前有个*号,表示该函数为指针型函数.§10.7指针数组和指向指针的指针(自学)一、指针数组概念:指针数组是一个数组,该数组中的每一个元素是指针变量。形式:类型标识符*数组名[数组元素个数]例:int*p[4];
定义一个指针数组,数组名p,有4个元素,每一个元素是指向整型变量的指针。二、指向指针的指针定义举例:
char**p;
char*name[]={“Ann”,“Hare”,“Jack”};p=name;p是一个指向指针的指针.被p指向的指针指向字符变量。name[0]name[1]name[2]AnnHareJackp二维字符数组name指针数组main(){inti;char*name[]={"Ann","Hare","Jack","Mary"};
/*storageaddressofperstring*/
char**p;
printf("\nStudents'snamesare:\n");for(i=0;i<4;i++){p=name+i;
/*pointintoaddressofnextcharstring*/printf("%6s\t",*p);}}运行结果:AnnHareJackMaryname[0]name[1]name[2]AnnHareJackp二维字符数组name指针数组name[3]mary§10.8指针使用小结
一、有关指针的数据类型定义:inti;
定义整型变量iint*p;p是指向整型数据的指针变量inta[n];
定义数组a,元素类型为int,元素个数是nint*p[n];
p是指针数组,包含n个指针,每一个指针可以指向整型数据intf();f是函数,返回值是int
int(*p)();p是函数指针,所指向的函数返回整型数据int*p();
p是函数,返回值是指针,该指针指向整型数据int**p;p是指针,指向一个指向整型数据的指针二、指针运算小结1、指针变量加/减运算
p++、p--、p+i、p-i、p+=i、p-=i
加1表示指向下一个数据。2、指针变量赋值
p=&a;变量a的地址赋给p,即指针p指向a
p=array;数组array首地址赋给p
p=&array[i];数组元素array[i]的地址赋给p
p=max;函数max的入口地址赋给p
p1=p2;指针p2的值赋给指针p1,
即p1、p2所指的数据相同
p=NULL;指针变量可以由空值,NULL的值为03、空指针p=NULL
空指针p=NULL表示p不指向任何数据。在stdio.h中,NULL被定义为0:
#defineNULL0
习惯上,不使用p=0而使用p=NULL指针变量p可以与NULL作比较,例:
if(p==NULL)...注意:空指针不指向任何数据,与p未赋值不同。当p未赋值时,其值是不确定的,而空指针的值是确定数0。4、指针变量相减。当p1、p2指向同一个数组的元素,指针相减p2-p1等于p1、p2间的元素个数。注意:指针相加无意义。5、两个指针的比较当p1、p2指向同一个数组的元素时,可以比较,如、p1>p2。若p1、p2不是指向同一个数组的元素,比较无意义。三、空类型指针void*void*p,表示p是空类型指针,它可以指向任何数据类型。空类型指针与其他类型指针之间赋值时,应进行强制类型转换.例、
char*p1;
void*p2;
p1=(char*)p2;
p2=(void*)p1;第10章习题10.1指针变量a所指的字符串长度为
,
这个长度是可以用strlen(a)测出来的。
char*a=“\nMYNameis\”zhang
li\”.\n”;(1)28(2)27(3)26(4)24(5)2310.2下面程序的作用是,将两个变量中的值互换,请检查程序是否正确,如不正确的,改正之。
main(){inta=3,b=4;
int*p1,*p2,*p;p1=&a,p2=&b;p=p1;p1=p2;p2=p;
printf(“a=%d,b=%d\n”,a,b);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 24434-2025坐便椅
- 管材销售合同2025年
- 2025年一级造价师之建设工程造价管理模考模拟试题(全优)
- 二零二五年度第五章国际货物买卖合同法实务操作手册
- 2025版城市地下综合管廊工程设计承包合同范本
- 二零二五年度产学研产学研合作技术人才培养与引进合同
- 2025年纺织品电商平台合作合同样本
- 2025版建筑工程安全生产环境监测合同范本
- 2025年度无人机设备采购与运营合作协议
- 二零二五年度船舶性能检测委托服务协议书
- (高清版)JTG D81-2017 公路交通安全设施设计规范
- 环境影响评价技术导则 核设施退役环境影响报告书(表)的格式和内容(征求意见稿)
- 幼儿心理健康教育智慧树知到期末考试答案2024年
- 武汉市2024届高中毕业生二月调研考试(二调)英语试卷(含答案)
- 颅内肿瘤之颅底肿瘤课件
- 华为胜任能力素质模型
- 《工件的定位与装夹》课件
- 经济学基础(郭克锋第二版)应用分析和能力训练参考答案
- 保险客户服务-课件
- 一例肺栓塞的护理个案
- 美世国际职位评估体系IPE3.0使用手册
评论
0/150
提交评论