C语言程序设计教程第8节新1

上传人:大米 文档编号:567520041 上传时间:2024-07-21 格式:PPT 页数:75 大小:523.50KB
返回 下载 相关 举报
C语言程序设计教程第8节新1_第1页
第1页 / 共75页
C语言程序设计教程第8节新1_第2页
第2页 / 共75页
C语言程序设计教程第8节新1_第3页
第3页 / 共75页
C语言程序设计教程第8节新1_第4页
第4页 / 共75页
C语言程序设计教程第8节新1_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《C语言程序设计教程第8节新1》由会员分享,可在线阅读,更多相关《C语言程序设计教程第8节新1(75页珍藏版)》请在金锄头文库上搜索。

1、C C语言程序设计教程语言程序设计教程- -第第8 8节节( (新新)1)1第8章 指针8.1 8.1 指针与指针变量指针与指针变量8.1.1 8.1.1 8.1.1 8.1.1 指针的概念指针的概念指针的概念指针的概念1.1.内存与变量地址内存与变量地址内存地址:内存地址:内存是计算机用于存储数据的存储器,以一个字节作为存储单元,为了便于访问,给每个字节单元一个唯一的编号,第一字节单元编号为0,以后各单元按顺序连续编号,这些单元编号称为内存单元的地址。变量地址:变量地址:变量所分配存储空间的首字节单元地址(字节单元编号)。2计算机教学中心李勇 C语言程序设计教程第8章 指针2.变量的三要素:

2、名字、类型与值每个变量都通过变量名与相应的存储单元相连系,具体分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。变量分配存储空间的大小由类型决定。变量的值则是指相应存储单元的内容。3.3.内存存取方式直接存取:把直接按变量名或地址存取变量值的方式称为“直接存取”方式。间接存取:通过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应的存储单元。3计算机教学中心李勇 C语言程序设计教程第8章 指针系统为特殊变量p(用来存放地址的)分配的存储空间地址是4800,p中保存的是变量a的地址,即4000,当要读取a变量的值12345时,不是直接通过a变量,也不是直接通

3、过保存12345的内存单元的地址4000去取值,而是先通过变量p得到p的值4000,即a的地址,再根据地址4000读取它所指向单元的值12345。这种间接的通过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取”。通常称变量p指向变量a,变量a是变量p所指向的对象400012345400040024800pap(4800)p(4800)a(4000)4000123454000间接存取示意图4计算机教学中心李勇 C语言程序设计教程第8章 指针4.指针的概念在语言中,用指针来表示一个变量指向另一个变量这样的指向关系。所谓指针即地址。一个变量的指针即该变量的地址,如4000就是指向变量a的

4、指针。指针变量:专门存放地址的变量,如p即是一个指针变量,它存放的是a的地址4000。5计算机教学中心李勇 C语言程序设计教程第8章 指针8.1.2指针变量的定义与初始化指针变量的定义与初始化1. 1. 指针变量的定义指针变量的定义类型标识符类型标识符*指针变量名;指针变量名;例:float*p1;(定义p1为指向实型变量的指针变量)char*p2;(定义p2为指向字符型变量的指针变量)在指针变量定义中,*是一个说明符,它表明其后的变量是指针变量,如p是指针变量,而不要认为“*p”是指针变量。指针变量定义时指定的数据类型不是指针变量本身(变量存放的值)的数据类型,而是指针变量所指向的对象(或称

5、目标)的数据类型指针变量存放的是所指向的某个变量的地址值,而普通变量保存的是该变量本身的值指针变量并不固定指向一个变量,可指向同类型的不同变量6计算机教学中心李勇 C语言程序设计教程第8章 指针(1)指针运算符与地址运算符指针运算符与地址运算符与指针引用有关的两个运算符:&与*。 &:取地址运算符 *:指针运算符,或称指向运算符、间接访问运算 符。指针指向的对象的表示形式: *指针变量此处*是访问指针所指对象的运算符,与指针定义时的*不同。2. 指针变量初始化7计算机教学中心李勇 C语言程序设计教程第8章 指针(2)指针变量初始化若有定义:inta,*p;语句仅仅定义了指针变量p,但指针变量并

6、未指向确定的变量(或内存单元)。因为这些指针变量还没有赋给确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量(内存单元)。指针变量初始化指针变量初始化:在定义指针时同时给指针一个初始值如:inta,*p=&a;40003a(4000)pa*pa8计算机教学中心李勇 C语言程序设计教程第8章 指针(3)指针变量的引用*指针变量名指针变量名代表所指变量的值。代表所指变量的值。指针变量名指针变量名代表所指变量的地址。代表所指变量的地址。有定义:inta,*p=&a;用*p来表示p指向的对象a,*p与a是等价的。*p可以象普通变量一样使用。例如:a=12;*p=12;sc

7、anf(%d,&*p);scanf(%d,p);printf(“%d%d”,*p,a);注注意意:*与&具有相同的优先级,结合方向从右到左。这样,&*p即&(*p),是对变量*p取地址,它与&a等价;p与&(*p)等价,a与*(&a)等价。9计算机教学中心李勇 C语言程序设计教程第8章 指针8.1.3指针运算1. 1. 指针的赋值运算指针的赋值运算(1)将变量地址值赋给指针变量,使指针指向该变量。设有如下定义:inta,b,*pa,*pb;float*pf;第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,因此pa、pb没有指向任何变量,下面语句完成对pa,pb的赋值:p

8、a=&a;pb=&b;10计算机教学中心李勇 C语言程序设计教程第8章 指针例如:intj=2,k=5;int*pointer1,*pointer2;pointer1=&j;pointer2=&k;&jpointer12j&kpointer25k11计算机教学中心李勇 C语言程序设计教程第8章 指针(2)相同类型的指针变量间的赋值相同类型的指针变量间的赋值pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa;即pa,pb都指向变量a,此时a、*pa、*pb是等价的。指针指向变化如下图:注注意意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是浮

9、点型指针。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb12计算机教学中心李勇 C语言程序设计教程第8章 指针()给指针变量赋()给指针变量赋空值空值给指针变量赋空值,说明该指针不指向任何变量。“空”指针值用NULL表示,NULL是在头文件stdio.h中预定义的常量,其值为,在使用时应加上预定义行,如:#includestdio.hint*pa=NULL;亦可以用下面的语句给指针赋“空值”:pa=0;或:pa=0;这里指针pa并非指向0地址单元,而是具有一个确定的“空值”,表示pa不指向任何变量。注注意意:指针虽然可以赋值0,但却不能把其它的常量地址赋给指针。例如:

10、 pa=4000; 是非法的。13计算机教学中心李勇 C语言程序设计教程第8章 指针例8.1指针定义与初始化main()inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);14计算机教学中心李勇 C语言程序设计教程第8章 指针程序运行结果:100,10100,10&a&bbpointer_1pointer_2a*pointer_1*pointer_215计算机教学中心李勇 C语言程序设计教程第8章

11、指针例8.2 从键盘上输入两个整数到a、b,按由大到小输出。#includemain()inta,b,*pa=&a,*pb=&b,*p;/*定义指针变量pa、pb,如下页图a*/scanf(%d%d,&a,&b);if(*pa*pb)p=pa;/*进行指针交换,如下页图b,c*/pa=pb;pb=p;printf(na=%d,b=%dn,a,b);printf(nmax=%d,min=%d,*pa,*pb);/*pa指向大数,pb指向小数*/16计算机教学中心李勇 C语言程序设计教程第8章 指针若输入:1222输出结果:a=12,b=22max=22,min=12(a)(b)(c)(b)指针变

12、化示意图1222ppapb1222ppapbpapbab17计算机教学中心李勇 C语言程序设计教程第8章 指针2. 2. 指针的算术运算指针的算术运算 (1) 加减运算:一个指针可以加、减一个整数n,其结果与指针所指对象的数据类型有关。指针变量的值应增加或减少“nsizeof(指针类型)”。 加加减减运运算算常常用用于于数数组组的的处处理理。对指向一般数据的指针,加减运算无实际意义。例如: int a10,*p=a,*x; x=p+3; /*实际上是p加上3*2个字节赋给x, x指向数组的第四个分量*/ 对于不同基类型的指针,指针变量“加上”或“减去”一个整数n所移动的字节数是不同的。例如:

13、float a10, *p=a, *x; p=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第四个分量*/ 18计算机教学中心李勇 C语言程序设计教程第8章 指针 (2) 自增自减运算指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。 例如: int a10, *p=a, *x; x=p+; /* x指向第一个元素分量, p指向第二个元素*/ x=+p; /* x、 p均指向数组的第二个分量*/* p+相当于*(p+ +)。*(p+)与(*p)+ 含义不同,前者表示地地址址自自增增,后者表示当前当前所指向的数据自增所指向的数据自增。 19计算

14、机教学中心李勇 C语言程序设计教程第8章 指针2.*&a的含意是什么?(答:a或*p)3.(*p)+相当于什么?(答:a+)思考:1.若有定义inta,*p;执行了“p=&a”,则:“&*p”的含意是什么?(答:相当于&a)20计算机教学中心李勇 C语言程序设计教程第8章 指针 3. 3.指针的关系运算指针的关系运算 与基本类型变量一样,指针可以进行关系运算。与基本类型变量一样,指针可以进行关系运算。在在关关系系表表达达式式中中允允许许对对两两个个指指针针进进行行所所有有的的关关系系运运算算。若若p,q是是两两个个同同类类型型的的指指针针变变量量,则则:pq,p=q都都是是允许的。允许的。指指

15、针针的的关关系系运运算算在在指指向向数数组组的的指指针针中中广广泛泛的的运运用用,假假设设p、q是是指指向向同同一一数数组组的的两两个个指指针针,执执行行pq的的运运算算,其其含含义义为为,若若表表达达式式结结果果为为真真(非非值值),则则说说明明p所所指指元元素素在在q所所指指元元素素之之后。或者说后。或者说q所指元素离数组第一个元素更近些。所指元素离数组第一个元素更近些。注注意意:在在指指针针进进行行关关系系运运算算之之前前,指指针针必必须须指指向向确确定定的的变变量量或或存存储储区区域域,即即指指针针有有初初始始值值;另另外外,只只有有相相同同类类型型的的指指针针才才能进行比较。能进行比

16、较。21计算机教学中心李勇 C语言程序设计教程第8章 指针8.1.4 8.1.4 多级指针多级指针 把指向指针型数据的指针变量称为指向指针的指针,或称称称称多多多多级级级级指针指针指针指针。二级指针的定义形式如下:数据类型 *指针变量例如:inta,*p,*pp;a=22;p=&a;pp=&p;思考:如何用pp得到a的值?假设变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。&p=4100&a=400022pp(4800)p(4100)a(4000)22计算机教学中心李勇 C语言程序设计教程第8章 指针8.2 指针与函数8.2.1 8.

17、2.1 指针作为函数参数指针作为函数参数利利用用指指针针作作函函数数参参数数,可可以以实实现现函函数数之之间间多多个个数数据据的的传传递递,当当形形参参为为指指针针变变量量时时,其其对对应应实实参参可可以以是是指针变量或存储单元地址。指针变量或存储单元地址。 函函数数形形参参为为指指针针变变量量,用用指指针针变变量量或或变变量量地地址址作实参作实参例例8.3编编写写一一个个交交换换两两个个变变量量的的函函数数,在在主主程程序序中中调用,实现两个变量值的交换。调用,实现两个变量值的交换。23计算机教学中心李勇 C语言程序设计教程第8章 指针程序如下:#includevoidswap(int*p1

18、,int*p2);/*函数声明函数声明*/main()inta,b;int*pa,*pb;scanf(%d%d,&a,&b);pa=&a;/*pa指向变量指向变量a*/pb=&b;/*pb指向变量指向变量b*/swap(pa,pb);printf(na=%d,b=%dn,a,b);或:swap(&a,&b);24计算机教学中心李勇 C语言程序设计教程第8章 指针接上页:voidswap(int*p1,int*p2)inttemp;temp=*p1;/*交换指针交换指针p1、p2所指向的变量的值所指向的变量的值*/*p1=*p2;*p2=temp;程序运行结果如下:程序运行结果如下:输入:输入:

19、1222 输出:输出:a=22,b=1225计算机教学中心李勇 C语言程序设计教程第8章 指针两点说明:(1)若若在在函函数数体体中中交交换换指指针针变变量量的的值值,实实参参a、b的的值值并并不不改变,指针参数亦是传值。改变,指针参数亦是传值。例如:例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成不要希望如此完成a,b值的交换。值的交换。(2)函函数数中中交交换换值值时时不不能能使使用用无无初初值值的的指指针针变变量量作作临临时时变变量。量。例如:例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对无确定值,对p的使用可能带来不可预期的后果。的使用可

20、能带来不可预期的后果。26计算机教学中心李勇 C语言程序设计教程第8章 指针8.2.2指针函数指针函数指针函数:是指返回值为指针的函数是指返回值为指针的函数指针函数的定义形式:指针函数的定义形式:类型标识符类型标识符 * *函数名(参数)函数名(参数)例如:例如:int *fun(int a,int b)int *fun(int a,int b) 函数体语句函数体语句 在函数体中有返回指针或地址的语句,形如在函数体中有返回指针或地址的语句,形如:return(&变量名变量名);或或return(指针变量指针变量);并且返回值的类型要与函数类型一致。并且返回值的类型要与函数类型一致。27计算机教

21、学中心李勇 C语言程序设计教程第8章 指针例8.3 分析如下程序main()inta,b,*p;int*max(intx,inty);scanf(“%d,%d”,&a,&b);p=max(a,b);printf(“max=%d”,*p);int*max(intx,inty)ifxy)return(&x);elsereturn(&y);28计算机教学中心李勇 C语言程序设计教程第8章 指针8.2.3 指向函数的指针一个函数包括一组指令序列,存储在某一段内存中,这段内一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为存空间的起始地址称为函数的入口地址函数的入口地址称函数入口地

22、址为称函数入口地址为函数的指针函数的指针。函数名函数名函数名函数名代表函数的入口地址代表函数的入口地址可以定义一个指针变量,其值等于该函数的入口地址,指向可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这种指针这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为变量称为指向函数的指针变量指向函数的指针变量。定义指向函数的指针变量的一般形式为定义指向函数的指针变量的一般形式为:类型标识符(类型标识符(* *指针变量名指针变量名)( )( );例如:例如:int(*p)();/*指针变量指针变量p可以指向一个整型函数可以指向一个整型函

23、数*/float(*q)();/*指针变量指针变量q可以指向一个浮点型函数可以指向一个浮点型函数*/29计算机教学中心李勇 C语言程序设计教程第8章 指针刚定义的指向函数的指针变量,亦象其它指针变量一样要刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函数的指针变量,就可用该指针变量来调用所指向的函数给函数指针赋初值:将函数名(函数的入口地址值)赋给给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量指针变量例如例如intm,(*p)()

24、;intmax(inta,intb);则可以则可以p=max;/*p指向函数指向函数max()*/指针调用函数的指针调用函数的一般形式为一般形式为:(* *指针变量指针变量)( )( 实参表实参表) );如上例如上例:m=(*p)(12,22);/*比较比较m=max(12,22);*/30计算机教学中心李勇 C语言程序设计教程第8章 指针注意:用用函函数数指指针针调调用用函函数数是是间间接接调调用用,没没有有参参数数类类型型说说明明,C编编译译系系统统也也无无法法进进行行类类型型检检查查,因因此此,在在使使用用这这种种形形式式调调用用函函数数时时要要特特别别小小心心。实实参参一一定定要要和和

25、指指针针所所指指函函数数的形参类型一致。的形参类型一致。函数指针可以作为函数参数,此时,当函数指针每次函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时,可执行不同的函数来完成不同的功指向不同的函数时,可执行不同的函数来完成不同的功能能例例 8.48.4 函数函数max()max()用来求一维数组的元素的最大值,在用来求一维数组的元素的最大值,在主调函数中用函数名调用该函数与用函数指针调用该函主调函数中用函数名调用该函数与用函数指针调用该函数来实现。数来实现。31计算机教学中心李勇 C语言程序设计教程第8章 指针程序如下:#includestdio.h#defineM8main()

26、floatsumf,sump;floataM=11,2,-3,4.5,5,69,7,80;float(*p)();/*定义指向函数的指针p*/floatmax(floata,intn);/*函数声明*/p=max;/*函数名(函数入口地址)赋给指针p*/sump=(*p)(a,M);/*用指针方式调用函数*/sumf=max(a,M);/*用函数名调用max()函数*/printf(sump=%.2fn,sump);printf(sumf=%.2fn,sumf);32计算机教学中心李勇 C语言程序设计教程第8章 指针程序接上页:floatmax(floata,intn)intk;floats;

27、s=a0;for(k=0;kn;k+)if(sak)s=ak;returns;程序运行结果:sump=80.00sumf=80.0033计算机教学中心李勇 C语言程序设计教程第8章 指针指向函数的指针的使用步骤:(1)定义一个指向函数的指针变量,形如:float(*p)();(2)为函数指针赋值,格式如下:p=函数名;注意:赋值时只需给出函数名,不要带参数。(3)通过函数指针调用函数,调用格式如下:s=(*p)(实参);34计算机教学中心李勇 C语言程序设计教程第8章 指针8.3 指针与数组8.3.1指向一维数组的指针指向一维数组的指针数组名是一个常量指针,它的值为该数组的首地址1.指指向向数

28、数组组的的指指针针的的定定义义方方法法与与指指向向基基本本类类型型变变量量的指针的定义方法相同的指针的定义方法相同,例如:inta10=1,3,5,7,9;int*p;p=&a2;(把数组元素a2的地址赋给指针变量p)p=a;(把数组的首地址赋给指针变量p)35计算机教学中心李勇 C语言程序设计教程第8章 指针C语言规定:数组名代表数组首地址,是一个地址常量。因此,下面两个语句等价:p=&a0;p=a;在定义指针变量的同时可赋初值:inta10,*p=&a0;(或int*p=a;)等价于:int*p;p=&a0;两句。36计算机教学中心李勇 C语言程序设计教程第8章 指针指向数组的指针变量p&

29、a013151719pa0:a9p9a+0p+1或a+1p+9或a+9*(a+9)或*(p+9)37计算机教学中心李勇 C语言程序设计教程第8章 指针2.通过指针引用数组元素*p=5;表示对p当前所指的数组元素赋以一个值5。C规定:p+1指向数组的下一元素(而不是将p值简单地加1)。p+1意味着使p的原值(地址)加d个字节(d为一个数组元素所占的字节数)。如果p的初值为&a0,则:(1)p+i和a+i就是ai的地址,或者说它们指向a数组的第i个元素(见下页图)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。(3)指向数组的指针变量也可以带下标,如pi与*(p+i)、

30、ai等价。38计算机教学中心李勇 C语言程序设计教程第8章 指针*(p+i)a数组a0a1a2aia9pp+1,a+1p+i,a+ip+9,a+9综上所述,引用一个数组元素有二法:(1)下标法:如ai、pi形式;(2)指针法:如*(a+i)或*(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。39计算机教学中心李勇 C语言程序设计教程第8章 指针main()inta10;inti;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);例8.5 用三种方法输出数组全部元素。(1)下标法40计算机教学

31、中心李勇 C语言程序设计教程第8章 指针main()inta10;inti;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,*(a+i);(2)通过数组名计算数组元素地址通过数组名计算数组元素地址,输出元素的值输出元素的值41计算机教学中心李勇 C语言程序设计教程第8章 指针(3)用指针变量指向数组元素main()inta10;int*p,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(p=a;p(a+10);p+)printf(%d,*p);三种方法的比较三种方法的比较:

32、用下标法下标法比较直观,能直接知道是第几个元素;而用指针法指针法则执行效率更高。42计算机教学中心李勇 C语言程序设计教程第8章 指针使用指针变量时,应注意:(1)指针变量可实现使本身的值改变。P+合法;但a+不合法(a是数组名,代表数组首地址,在程序运行中是固定不变的。)(2)要注意指针变量的当前值。main()inta10;int*p,i;p=a;for(;pa+10;p+)scanf(%d,p);printf(n);for(;p(a+10);p+)printf(%d,*p);不能&p增加:p=a;为什么?43计算机教学中心李勇 C语言程序设计教程第8章 指针(3)*p+相当于*(p+),

33、因为*与+优先级相同,且结合方向从右向左,其作用是先获得p指向变量的值,然后执行p=p+1;(4)*(p+)与*(+p)意义不同,后者是先p=p+1,再获得p指向的变量值。 若p=a,则输出*(p+)是先输出a0,再让p指向a;输出*(+p)是先使p指向a,再输出p所指的a。(5)(*p)+表示的是将p指向的变量值+ 44计算机教学中心李勇 C语言程序设计教程第8章 指针小结1、如何使得一个指针指向一个数组?1)利用数组首元素的地址;2)利用数组名;2、如何引用一个数组元素的值?1)下标法:a.利用数组名加下标;b.利用指针变量名加下标;2)指针法:a.利用对数组名的间接访问;b.利用对指针变

34、量的间接访问。45计算机教学中心李勇 C语言程序设计教程第8章 指针8.3.2 二维数组与多维数组的指针表示法 1.二维数组的地址二维数组的地址设有一个二维数组a,它有三行四列:inta34;数组名a:代表整个二维数组的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(见下页图)46计算机教学中心李勇 C语言程序设计教程第8章 指针数组名a代表整个二维数组的首地址:a0a1a2a=19173111971523上图 a数组包含三个元素:a0,a1,a2. 而每个元素又是一个一维数组,它包含4个元素(即4个列元素),如:a0又包含:a00,a01,a02,a03.47计算机教学中心李勇

35、C语言程序设计教程第8章 指针一维数组名ai:代表第i行的首地址,即第i行中第0列元素的地址(既&ai0)。ai+j:代表第i行中的第j个元素的地址,即为&aij。注意地址变化的单位数值在不同的场合的实际字节数是不同的:“a+1”中的“1”实际代表数组中一行元素所占的总字节数;“ai+1”中的“1”代表数组中一个元素所占的字节数。48计算机教学中心李勇 C语言程序设计教程第8章 指针a+2a数组a0a1a2aa+1(2000)(2008)(2016)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4个整型数据(即1个元素占2个字节),因此,这里+1的含义是:+

36、4*2=+8个字节.49计算机教学中心李勇 C语言程序设计教程第8章 指针2000120023200452006720089201011201213201415201617201819202021202223aa+1a+2a0+1 a0+2 a0+3行地址,元素地址的表示法50计算机教学中心李勇 C语言程序设计教程第8章 指针例例8.6 8.6 用指针表示法输出二维数组的各元素。用指针表示法输出二维数组的各元素。#includemain()staticinta23=0,1,2,3,4,5;intk,j,*p;for(j=0;j2;j+)/*方式方式1*/for(k=0;k3;k+)printf

37、(%5d,*(aj+k);/*aj是是j行首地址,行首地址,aj+k是是j行行k列元素的地址列元素的地址*/putchar(n);putchar(n);51计算机教学中心李勇 C语言程序设计教程第8章 指针接上页:for(j=0;j2;j+)/*方式方式2*/for(k=0;k3;k+)printf(%5d,*(*(a+j)+k);/*(a+j)是是j行首地址,行首地址,*(a+j)+k是是j行行k列元素的地址列元素的地址*/putchar(n);p=a;/*p指向数组的第一个元素*/for(j=0;j2;j+)/*方式方式3*/for(k=0;k=A&*str=n)p+=n-1;/*指针指到

38、要复制的第一个字符指针指到要复制的第一个字符*/63计算机教学中心李勇 C语言程序设计教程第8章 指针for(;*p!=0;p+,q+)*q=*p;*q=0;/*字符串以0结尾*/printf(Stringa:%sn,a);printf(Stringb:%sn,b);输入:3输出:computermputer考虑一下,若输出语句改为如下语句会如何?printf(“string a is :%sn”,p);printf(“string b is %sn”,q);64计算机教学中心李勇 C语言程序设计教程第8章 指针本章小结1、指指针针是是一一种种存存放放地地址址的的变变量量,像像其其他他的的变变

39、量量一一样样,须须在在使使用用前前定定义义。指指针针变变量量的的命命名名遵遵守守与与其其他他变变量量相相同同的的命命名名规则。指针变量定义格式如下:规则。指针变量定义格式如下:类型名类型名*指针变量名指针变量名;2、两两个个与与指指针针变变量量有有关关的的运运算算符符:& &(取取地地址址运运算算符符)和和 * *(指指针针运运算算符符)。其其中中:& &运运算算符符只只能能作作用用于于变变量量,包包括括基基本本类类型型变变量量和和数数组组的的元元素素,不不能能作作用用于于数数组组名名和和常常量量,其其结结果果是是取取运运算算对对象象的的存存储储地地址址。* *运运算算符符也也称称间间接接访访

40、问问运运算算符符,其其操操作作对对象象是是地地址址,通通过过对对该该地地址址的的间间接接访访问问达达到到存存取取变变量量值的目的。值的目的。65计算机教学中心李勇 C语言程序设计教程第8章 指针 4 4、可以利用指针变量方便地对数组进行存取。如果、可以利用指针变量方便地对数组进行存取。如果指针指针 变量变量p p的初值为数组的初值为数组a a的首地址的首地址,则,则p+ip+i和和a+ia+i就是就是aiai 的地址,的地址,* *(p+i)p+i)和和*(a+i)*(a+i)既是数组元素既是数组元素aiai的值。的值。3、C语言规定向被调函数进行参数传递只能是单向值传语言规定向被调函数进行参

41、数传递只能是单向值传 递即传值的方式,采向被调函数传指针变量的方式则递即传值的方式,采向被调函数传指针变量的方式则 变相地实现了参数传递中非常重要的一种方式变相地实现了参数传递中非常重要的一种方式传传 地址地址,从而使得主调函数与被调函数发生了某种意义,从而使得主调函数与被调函数发生了某种意义 上的关联,这样使得程序的编制更加灵活,比如我们上的关联,这样使得程序的编制更加灵活,比如我们 可以通过这种参数传递方式从被调函数返回多个值。可以通过这种参数传递方式从被调函数返回多个值。66计算机教学中心李勇 C语言程序设计教程第8章 指针5、指指针针指指向向字字符符串串时时,是是把把字字符符串串的的首

42、首地地址赋址赋 给字符指针。可以通过给字符指针。可以通过* *运算符对字符指针进行操运算符对字符指针进行操 作以达到操作字符串各个字符的目的,具体操作方作以达到操作字符串各个字符的目的,具体操作方法与利用指向数组的指针相同。法与利用指向数组的指针相同。67计算机教学中心李勇 C语言程序设计教程第8章 指针例例 编编写写一一个个交交换换两两个个变变量量的的函函数数,在在主主程程序序中中 调用,实现两个变量值的交换。调用,实现两个变量值的交换。( (假定假定a a和和b b两个变量)两个变量)分析:分析: 此此程程序序要要求求进进行行模模块块化化程程序序设设计计,其其中中mainmain函函数数完

43、完成成数数据据的的输输入入及及结结果果的的输输出出并并进进行行交交换换函函数数(swapswap)的调用,)的调用,swapswap函数完成两个变量值的交换。函数完成两个变量值的交换。 编编程程的的重重点点在在于于考考虑虑如如何何从从swapswap函函数数中中得得到到两个返回值及两个返回值及mainmain函数和函数和swapswap函数参数的传递方法。函数参数的传递方法。8.6程序举例程序举例68计算机教学中心李勇 C语言程序设计教程第8章 指针voidswap(intx,inty)inttemp;temp=x;x=y;y=x;main()inta,b;scanf(“%d%d”,&a,&b

44、);swap(a,b);printf(“%d%d”,a,b);voidswap(int*x,int*y)int*temp=NULL;temp=x;x=y;y=x;main()inta,b,*p,*q;scanf(“%d%d”,&a,&b);p=&a;q=&b;swap(p,q);printf(“%d%d”,a,b);voidswap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;main()inta,b,*p,*q;scanf(“%d%d”,&a,&b);p=&a;q=&b;swap(p,q);printf(“%d%d”,a,b);69计算机教学中心李勇

45、C语言程序设计教程第8章 指针两点说明:两点说明:(1)若若在在函函数数体体中中交交换换指指针针变变量量的的值值,实实参参a、b的的值值并并不不改变,指针参数亦是传值。改变,指针参数亦是传值。例如:例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成处理。不要希望如此完成处理。(2)函函数数中中交交换换值值时时不不能能使使用用无无初初值值的的指指针针变变量量作作临临时时变变量。量。例如:例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对无确定值,对p的使用可能带来不可预期的后果。的使用可能带来不可预期的后果。70计算机教学中心李勇 C语言程序设计教程第8

46、章 指针例2:编制求一个整型数组中所有偶数元素和及奇数元素和的函数并在main函数中输出。分析:1、数组元素的输入;2、程序结果的输出;3、函数调用时参数传递的方式;4、算法:遍历所给数组的全部元素;如果某个数组元素为偶数则求和并将结果存入偶数和变量sum1,反之求和后存入奇数和变量sum2中。71计算机教学中心李勇 C语言程序设计教程第8章 指针main()inta10=1,21,10,34,45,23,11,9,22,18,sum1=0,sum2=0;sum(&sum1,&sum2,a);printf(“%d%dn”,sum1,sum2);voidsum(int*x,int*y,int*z)inti;for(i=0;i=0&*p=9)*q+=*p;*q=0;74计算机教学中心李勇 C语言程序设计教程结束结束

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号