C语言程序设计教程新.pptx
《C语言程序设计教程新.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计教程新.pptx(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、12.变量的三要素:名字、类型与值 每个变量都通过变量名与相应的存储单元相连系,具体分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。变量分配存储空间的大小由类型决定。变量的值则是指相应存储单元的内容。3.3.内存存取方式 直接存取:把直接按变量名或地址存取变量值的方式称为“直接存取”方式。间接存取:通过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应的存储单元。第1页/共73页2系统为特殊变量系统为特殊变量p p(用来存放地址的)分配的存储空间地(用来存放地址的)分配的存储空间地址是址是48004800,p p中保存的是变量中保存的是变量a a的地址的
2、地址,即即40004000,当要读取,当要读取a a变量的值变量的值1234512345时,不是直接通过时,不是直接通过a a变量变量,也不是直接通过也不是直接通过保存保存1234512345的内存单元的地址的内存单元的地址40004000去取值,而是先通过变去取值,而是先通过变量量p p得到得到p p的值的值40004000,即,即a a的地址,再根据地址的地址,再根据地址40004000读取它读取它所指向单元的值所指向单元的值1234512345。这种间接的通过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取”。通常称变量p指向变量a,变量a是变量p所指向的对象40001234
3、5400040024800pap(4800)p(4800)a(4000)4000123454000间接存取示意图第2页/共73页34.指针的概念 在语言中,用指针来表示一个变量指向另一个变量这样的指向关系。所谓指针即地址。一个变量的指针即该变量的地址,如4000就是指向变量a的指针。指针变量:专门存放地址的变量,如p即是一个指针变量,它存放的是a的地址4000。第3页/共73页48.1.2指针变量的定义与初始化1.1.指针变量的定义指针变量的定义类型标识符*指针变量名;例:float *p1;(定义p1为指向实型变量的指针变量)char *p2;(定义p2为指向字符型变量的指针变量)在指针变量
4、定义中,*是一个说明符,它表明其后的变量是指针变量,如p是指针变量,而不要认为“*p”是指针变量。指针变量定义时指定的数据类型不是指针变量本身(变量存放的值)的数据类型,而是指针变量所指向的对象(或称目标)的数据类型 指针变量存放的是所指向的某个变量的地址值,而普通变量保存的是该变量本身的值 指针变量并不固定指向一个变量,可指向同类型的不同变量第4页/共73页5(1)指针运算符与地址运算符指针运算符与地址运算符与指针引用有关的两个运算符:&与*。&:取地址运算符 *:指针运算符,或称指向运算符、间接访问运算 符。指针指向的对象的表示形式:*指针变量此处*是访问指针所指对象的运算符,与指针定义时
5、的*不同。2.指针变量初始化第5页/共73页6(2)指针变量初始化若有定义:int a,*p;语句仅仅定义了指针变量p,但指针变量并未指向确定的变量(或内存单元)。因为这些指针变量还没有赋给确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量(内存单元)。指指针针变变量量初初始始化化:在定义指针时同时给指针一个初始值如:int a,*p=&a;40003a(4000)pa*pa第6页/共73页7(3)指针变量的引用*指针变量名指针变量名代表所指变量的值。代表所指变量的值。指针变量名指针变量名代表所指变量的地址。代表所指变量的地址。有定义:int a,*p=&a;用*
6、p来表示p指向的对象a,*p与a是等价的。*p可以象普通变量一样使用。例如:a=12;*p=12;scanf(%d,&*p);scanf(%d,p);printf(“%d%d”,*p,a);注注意意:*与&具有相同的优先级,结合方向从右到左。这样,&*p即&(*p),是对变量*p取地址,它与&a等价;p与&(*p)等价,a与*(&a)等价。第7页/共73页88.1.3指针运算1.1.指针的赋值运算指针的赋值运算(1)将变量地址值赋给指针变量,使指针指向该变量。设有如下定义:int a,b,*pa,*pb;float*pf;第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,
7、因此pa、pb没有指向任何变量,下面语句完成对pa,pb的赋值:pa=&a;pb=&b;第8页/共73页9例如:int j=2,k=5;int*pointer1,*pointer2;pointer1=&j;pointer2=&k;&jpointer12j&kpointer25k第9页/共73页10(2)相同类型的指针变量间的赋值相同类型的指针变量间的赋值 pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa;即 pa,pb都指向变量a,此时a、*pa、*pb是等价的。指针指向变化如下图:注注意意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是
8、浮点型指针。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb第10页/共73页11()给指针变量赋()给指针变量赋空值空值给指针变量赋空值,说明该指针不指向任何变量。“空”指针值用NULL表示,NULL是在头文件stdio.h中预定义的常量,其值为,在使用时应加上预定义行,如:#includestdio.hint*pa=NULL;亦可以用下面的语句给指针赋“空值”:pa=0;或:pa=0;这里指针pa并非指向0地址单元,而是具有一个确定的“空值”,表示pa不指向任何变量。注注意意:指针虽然可以赋值0,但却不能把其它的常量地址赋给指针。例如:pa=4000;是非法的。第1
9、1页/共73页12例8.1指针定义与初始化main()int a,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);第12页/共73页13程序运行结果:100,10100,10&a&bbpointer_1pointer_2a*pointer_1*pointer_2第13页/共73页14例例8.2 8.2 从键盘上输入两个整数到从键盘上输入两个整数到a a、b,b,按由大到小输出。按由大到小输出。#inclu
10、de main()int a,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(n a=%d,b=%dn,a,b);printf(n max=%d,min=%d,*pa,*pb);/*pa指向大数,pb指向小数*/第14页/共73页15若输入:若输入:1222输出结果输出结果:a=12,b=22max=22,min=12(a)(b)(c)指针变化示意图1222ppapb1222ppapbpapbab第15页/共73页162.2.
11、指针的算术运算指针的算术运算 (1)加减运算:一个指针可以加、减一个整数n,其结果与指针所指对象的数据类型有关。指针变量的值应增加或减少“nsizeof(指针类型)”。加加减减运运算算常常用用于于数数组组的的处处理理。对指向一般数据的指针,加减运算无实际意义。例如:int a10,*p=a,*x;x=p+3;/*实际上是p加上3*2个字节赋给x,x指向数组的第四个分量*/对于不同基类型的指针,指针变量“加上”或“减去”一个整数n所移动的字节数是不同的。例如:float a10,*p=a,*x;p=p+3;/*实际上是p加上3*4个字节赋给x,x依然指向数组的第四个分量*/第16页/共73页17
12、(2)(2)自增自减运算指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。例如:int a10,*p=a,*x;x=p+;/*x指向第一个元素分量,p指向第二个元素*/x=+p;/*x、p均指向数组的第二个分量*/*p+相当于*(p+)。*(p+)与(*p)+含义不同,前者表示地址自增,后者表示当前所指向的数据自增。第17页/共73页182.*&a的含意是什么?(答:a或*p)3.(*p)+相当于什么?(答:a+)思考:1.若有定义inta,*p;执行了“p=&a”,则:“&*p”的含意是什么?(答:相当于&a)第18页/共73页19 3.3.指针的关系运算指针
13、的关系运算 与基本类型变量一样,指针可以进行关系运算。与基本类型变量一样,指针可以进行关系运算。在在关关系系表表达达式式中中允允许许对对两两个个指指针针进进行行所所有有的的关关系系运运算算。若若p,q是是 两两 个个 同同 类类 型型 的的 指指 针针 变变 量量,则则:pq,p=q都是允许的。都是允许的。指指针针的的关关系系运运算算在在指指向向数数组组的的指指针针中中广广泛泛的的运运用用,假假设设p、q是是指指向向同同一一数数组组的的两两个个指指针针,执执行行pq的的运运算算,其其含含义义为为,若若表表达达式式结结果果为为真真(非非值值),则则说说明明p所所指指元元素素在在q所所指指元元素素
14、之之后后。或或者者说说q所所指指元元素素离离数数组组第第一一个个元元素素更更近近些。些。注注意意:在在指指针针进进行行关关系系运运算算之之前前,指指针针必必须须指指向向确确定定的的变变量量或或存存储储区区域域,即即指指针针有有初初始始值值;另另外外,只只有有相相同同类类型型的指针才能进行比较。的指针才能进行比较。第19页/共73页208.1.4 8.1.4 多级指针 把指向指针型数据的指针变量称为指向指针的指针,或称称称称多多多多级指针级指针级指针级指针。二级指针的定义形式如下:数据类型 *指针变量例如:int a,*p,*pp;a=22;p=&a;pp=&p;思考:如何用pp得到a的值?假设
15、变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。&p=4100&a=400022pp(4800)p(4100)a(4000)第20页/共73页218.2 8.2 指针与函数指针与函数8.2.1 8.2.1 指针作为函数参数指针作为函数参数利利用用指指针针作作函函数数参参数数,可可以以实实现现函函数数之之间间多多个个数数据据的的传传递递,当当形形参参为为指指针针变变量量时,其对应实参可以是指针变量或存储单元地址。时,其对应实参可以是指针变量或存储单元地址。函数形参为指针变量,用指针变量或变量地址作实参例例8.3编编写写一一个个交交换换两
16、两个个变变量量的的函函数数,在在主主程程序序中中调调用用,实实现现两两个个变变量量值值的的交交换。换。第21页/共73页22程序如下:程序如下:#includevoidswap(int*p1,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);第22页/共73页23接上页:接上页:voidswap(int*p1,int*p2)inttemp;
17、temp=*p1;/*交换指针交换指针p1、p2所指向的变量的值所指向的变量的值*/*p1=*p2;*p2=temp;程序运行结果如下:程序运行结果如下:输入:输入:12 22 输出:输出:a=22,b=12第23页/共73页24两点说明:两点说明:(1)若若在在函函数数体体中中交交换换指指针针变变量量的的值值,实实参参a、b的的值值并不改变,指针参数亦是传值。并不改变,指针参数亦是传值。例如:例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成不要希望如此完成a,b值的交换。值的交换。(2)函函数数中中交交换换值值时时不不能能使使用用无无初初值值的的指指针针变变量量作作临临时变
18、量。时变量。例如:例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对无确定值,对p的使用可能带来不可预期的后果。的使用可能带来不可预期的后果。第24页/共73页258.2.2指针函数指针函数指针函数:是指返回值为指针的函数是指返回值为指针的函数指针函数的定义形式:类型标识符类型标识符 *函数名(参数)函数名(参数)例如:例如:int*fun(int a,int b)int*fun(int a,int b)函数体语句函数体语句 在函数体中有返回指针或地址的语句,形如在函数体中有返回指针或地址的语句,形如:return(&变量名变量名);或或return(指针变量指针变量
19、);并且返回值的类型要与函数类型一致。并且返回值的类型要与函数类型一致。第25页/共73页26例8.3 8.3 分析如下程序main()int a,b,*p;int *max(int x,int y);scanf(“%d,%d”,&a,&b);p=max(a,b);printf(“max=%d”,*p);int*max(intx,inty)ifxy)return(&x);elsereturn(&y);第26页/共73页278.2.3 8.2.3 指向函数的指针一个函数包括一组指令序列,存储在某一段内存中,这一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为段内存空间的起始
20、地址称为函数的入口地址函数的入口地址称函数入口地址为称函数入口地址为函数的指针函数的指针。函数名函数名函数名函数名代表函数的入口地代表函数的入口地址址可以定义一个指针变量,其值等于该函数的入口地址,指可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这向这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为种指针变量称为指向函数的指针变量指向函数的指针变量。定义指向函数的指针变量的一般形式为定义指向函数的指针变量的一般形式为:类型标识符(类型标识符(*指针变量名指针变量名)()();例如:例如:int(*p)();/*指指针针变变量量
21、p可可以以指指向向一一个个整整型型函函数数*/float(*q)();/*指指针针变变量量q可可以以指指向向一一个个浮浮点点型型函函数数*/第27页/共73页28刚定义的指向函数的指针变量,亦象其它指针变量一样刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函向函数的指针变量,就可用该指针变量来调用所指向的函数数给函数指针赋初值:将函数名(函数的入口地址值)赋给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量给指针变量例如例如intm,(*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 教程
限制150内