谭浩强C程序设计指针.pptx
《谭浩强C程序设计指针.pptx》由会员分享,可在线阅读,更多相关《谭浩强C程序设计指针.pptx(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1谭浩强谭浩强C程序设计指针程序设计指针6.1 指针的概念指针的概念1.1.内存地址内存地址 计算机的内存储器被划分成一个个的存储单元,这些存储单元按一定的规则编号,这个编号就是存储单元的地址。每个存储单元的大小为一个字节,每个单元有一个唯一的地址。20000000第1页/共60页2.2.变量的地址变量的地址 在程序中定义的所有变量,都要分配相应的存储单元,不同类型的数据所需要的存储空间的大小不同。系统分配给变量的内存空间的起始单元地址称为该变量的地址。如:intI,K;I=3;K=5;000020002004IK35第2页/共60页3.3.内存单元的访问方式内存单元的访问方式内存单元的
2、访问方式内存单元的访问方式n n在程序中一般通过变量名访问(存取)内存单元.这种按变量地址存取变量值的方式称为直接存取方式,或直接访问方式.n n间接存取(间接访问)方式是指将变量I的地址存放在另一个变量J中,通过变量J访问变量I的值.2000000020002004200635IKJ第3页/共60页 4.4.指针与指针变量指针与指针变量指针与指针变量指针与指针变量n n指针:一个变量的地址也称为该变量的指针。n n 指针变量:用于存储其它变量的指针(即地址)的变量。n n指针变量的定义:数据类型 *指针变量名;如:int*p1;float*p2;char*p3;第4页/共60页 6.2.指针
3、变量的指针变量的使用使用1.1.指针变量的赋值指针变量的赋值n n通常把被指向的变量的地址赋给指针通常把被指向的变量的地址赋给指针变量变量 如:如:int*p1,int*p1,a=3a=3;p1=p1=&a;a;&:&:取地址运算符取地址运算符 注意:注意:不能用一个整数给一个指针变量赋值不能用一个整数给一个指针变量赋值.一个指针变量只能指向同一个类型的一个指针变量只能指向同一个类型的变量变量.20003p1a2000第5页/共60页 6.2.指针变量的指针变量的使用使用2.2.指针变量的引用指针变量的引用 间接访问指针变量所指向的存储单元.指针运算符(*)如:int*p1,a=3;p1=&a
4、;inta1;a1=*p1;*p1=5;注意:指针变量必须指向具体内存地址才能引用.如:int*p;*p=10;20003p1a2000第6页/共60页例例 通过指针变量存取变通过指针变量存取变量的值量的值#include#include void main()void main()int a,*p1;int a,*p1;double b,*p2;double b,*p2;char c,*p3;char c,*p3;p1=&a;p1=&a;p2=&b;p2=&b;p3=&c;p3=&c;*p1=10;*p1=10;*p2=11.2;*p2=11.2;*p3=A;*p3=A;cout a end
5、l;cout a endl;cout b endl;cout b endl;cout c endl;cout c endl;程序运行结果为:程序运行结果为:1011.2A100 x2000ap111.20 x2004bp2A0 x200Ccp3第7页/共60页例例例例6.2 6.2 输入输入输入输入a a和和和和b b两个数,按从小到大的顺序输出两个数,按从小到大的顺序输出两个数,按从小到大的顺序输出两个数,按从小到大的顺序输出#include#include void main()void main()int a,b;int a,b;int*p1,*p2,*p;int*p1,*p2,*p;c
6、out cout a b;cin a b;p1=&a;p1=&a;p2=&b;p2=&b;if(*p1 *p2)if(*p1 *p2)p=p1;p=p1;p1=p2;p1=p2;p2=p;p2=p;cout min=*p1 max=*p2 cout min=*p1 max=*p2 endl;endl;程序运行结果为:程序运行结果为:请输入两个整数:30 10min=10 max=30&ap1&bp2p30a10b&bp1&ap2&ap30a10b第8页/共60页3.3.指针作为函数的参数指针作为函数的参数指针作为函数的参数指针作为函数的参数指针作为函数的参数,传递的是变量的地址,可以实现指针作
7、为函数的参数,传递的是变量的地址,可以实现地址地址传递传递。例例6.3 6.3 指针作为函数参数,被调函数中交换参数值指针作为函数参数,被调函数中交换参数值#include void swap(int*x,int*y);void main()int a,b;a=10;b=20;swap(&a,&b);cout a ,b endl;void swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;第9页/共60页程序运行过程中变量值的变化分析yyb10ax20by&ax&b10temp20ax20by10temp&aax&bb10temp&a&btemp1
8、0a20&a&b2010(a)(b)(c)(d)程序运行结果为:程序运行结果为:2020,1010第10页/共60页比较数值型参数比较数值型参数比较数值型参数比较数值型参数#include#includevoidswap(intx,inty);voidswap(intx,inty);voidmain()voidmain()inta,b;inta,b;a=10;a=10;b=20;b=20;swap(a,b);swap(a,b);couta,bcouta,bendl;endl;10a10 x20b20y1020 xy10temp2020 xy10temp2010 xy10tempvoid swa
9、p(int x,int y)int temp;temp=x;x=y;y=temp;注意:值传递时,函数的实参与形参在内存中占用不同的存储空间,值注意:值传递时,函数的实参与形参在内存中占用不同的存储空间,值只能由实参传递给形参,而形参的变化并不会影响实参。只能由实参传递给形参,而形参的变化并不会影响实参。第11页/共60页比较以下函数比较以下函数#include#includevoidswap(int*x,int*y);voidswap(int*x,int*y);voidmain()voidmain()inta,b;inta,b;a=10;a=10;b=20;b=20;swap(&a,&b);
10、swap(&a,&b);couta,couta,bendl;bendl;void swap(int*x,int*y)int*temp;temp=x;x=y;y=temp;void swap(int*x,int*y)int*temp;*temp=*x;*x=*y;*y=*temp;#第12页/共60页 1.1.指针运算指针运算n n指针运算包括指针运算包括算术运算算术运算、关系运算关系运算与与赋值运算赋值运算。n n 指针可以与整数进行指针可以与整数进行加减运算加减运算,结果,结果与指针所指向与指针所指向的数据类型的数据类型有关。有关。p+np+n表示指针表示指针p p当前所指向位置后面当前所指
11、向位置后面第第n n个同类型数据的地址,个同类型数据的地址,p-np-n表示指针表示指针p p当前所指向位当前所指向位置前面第置前面第n n个同类型数据的地址。个同类型数据的地址。6.3 指针与数组指针与数组第13页/共60页例例例例 指针与整数的加减运算指针与整数的加减运算指针与整数的加减运算指针与整数的加减运算#include#includevoidmain()voidmain()inta,*p1,*p2;inta,*p1,*p2;doubleb,*p3,*p4;doubleb,*p3,*p4;p1=&a;p1=&a;p3=&b;p3=&b;coutp1p3endl;coutp1p3end
12、l;p2=p1+1;p2=p1+1;/p1+1/p1+1与与p3+1p3+1的含义不同,与指针数据类型有关的含义不同,与指针数据类型有关p4=p3+1;p4=p3+1;coutp2p4endl;coutp2p4endl;p2=p1-1;p2=p1-1;/p1-1/p1-1与与p3-1p3-1的含义不同,与指针数据类型有关的含义不同,与指针数据类型有关p4=p3-1;p4=p3-1;coutp2p4endl;coutp2p4endl;p2=p1+5;p2=p1+5;p4=p3+5;p4=p3+5;coutp2p4endl;coutp2p4endl;程序运行结果为:程序运行结果为:0 x0012F
13、F7C 0 x0012FF6C0 x0012FF80 0 x0012FF740 x0012FF78 0 x0012FF640 x0012FF90 0 x0012FF94第14页/共60页n n指向同一种数据类型的指针可以进行关系运算。两个相同类型的指针相等,表示这两个指针指向同一个地址。n n指针也可以与0进行比较运算,如果p=0成立,我们称p是一个空指针,即指针p还没有具体指向。n n为了避免使用没有指向的指针,在定义指针变量时,可以将其初始化为0(也可以写成NULL)。指针的关系运算指针的关系运算第15页/共60页例例例例:使用空指针使用空指针使用空指针使用空指针#include#incl
14、udevoidmain()voidmain()inta,*p=NULL;inta,*p=NULL;coutpendl;coutpendl;if(p!=NULL)if(p!=NULL)*p=10;*p=10;coutcout将将1010赋值给赋值给p p所指向的地址所指向的地址endl;endl;elseelsecoutpcoutp是空指针,不能使用!是空指针,不能使用!endl;endl;p=&a;p=&a;coutpendl;coutpendl;if(p!=NULL)if(p!=NULL)*p=10;*p=10;coutcout将将1010赋值给赋值给p p所指向的地址所指向的地址endl;
15、endl;elseelsecoutpcoutp是空指针,不能使用!是空指针,不能使用!endl;endl;程序运行结果为:程序运行结果为:0 x00000000p是空指针,不能使用!0 x0012FF7C将10赋值给p所指向的地址第16页/共60页n n数组在内存中是连续存放的,每个数组元素都占用存储单元,有相应地址,所以指针可以指向数组元素.如:inta10,*p;p=&a5;*p,a5含义相同 2.2.指向数组元素的指针指向数组元素的指针指向数组元素的指针指向数组元素的指针第17页/共60页n n 数组名就是数组的首地址(第一个元素的地址),指针可以与整数进行加减运算,利用这一性质可以方便
16、地通过指针引用数组元素。如:inta10,*p;则:p=a;p=&a0;含义相同p+ia+i含义相同*(p+i)*(a+i)ai含义相同注:又称变址运算符.ai的地址为:a+i*dn n指向数组元素的指针变量也可带下标,如pi.2.2.指向数组元素的指针指向数组元素的指针指向数组元素的指针指向数组元素的指针第18页/共60页例例例例 使用指针输出数组中的所有元素使用指针输出数组中的所有元素使用指针输出数组中的所有元素使用指针输出数组中的所有元素#include#includevoidmain()voidmain()inta6=1,2,3,4,5,6;inta6=1,2,3,4,5,6;int*
17、p;int*p;p=a;p=a;for(inti=0;i6;i+)for(inti=0;i6;i+)cout*p;cout*p;p+;p+;coutendl;coutendl;程序运行结果为:程序运行结果为:1 2 3 4 5 6123456ap第19页/共60页例例例例6.5 6.5 输出数组中的全部元素。输出数组中的全部元素。输出数组中的全部元素。输出数组中的全部元素。n n下标法下标法#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain()inta10;inta10;inti;inti;for(i=0;i
18、10;i+)for(i=0;iai;cinai;coutendl;coutendl;for(i=0;i10;i+)for(i=0;i10;i+)coutai;coutai;coutendl;coutendl;return0;return0;n 用指针变量指向数组元素用指针变量指向数组元素#include using namespace std;int main()int a10;int i,*p=a;for(i=0;i*(p+i);/输入输入a0a9coutendl;for(p=a;p(a+10);p+)cout*p;coutendl;return 0;第20页/共60页比较比较n n下标法每
19、次通过变址运算符计算数组下标法每次通过变址运算符计算数组元素的地址元素的地址,指针变量直接指向元素指针变量直接指向元素,不必每次都重新计算地址不必每次都重新计算地址,故效率高故效率高.n n但是但是,用下标法比较直观用下标法比较直观,能直接知道能直接知道第几个元素第几个元素.第21页/共60页注意注意n n指针变量可能指向数组以后的内存单元,在使用指针变量指向数组元素时,应切实保证指向数组中有效的元素.n n注意指针变量自加自减运算及其所指向的元素.n np+p+使使p p指向下一个元素指向下一个元素n n*p+p+先得到先得到p p所指变量值所指变量值,再使再使p p加加1.1.等同于等同于
20、*(p+).(p+).n n*(+p)*(+p)先使先使p p加加1,1,再得到再得到p p所指变所指变量值量值.n n(*p)+(*p)+表示表示p p所指向的所指向的元素值元素值加加1.1.第22页/共60页例例例例:指向同一个数组的两个指针的减法运算指向同一个数组的两个指针的减法运算指向同一个数组的两个指针的减法运算指向同一个数组的两个指针的减法运算#include#includevoidmain()voidmain()inta10=1,2,3,4,5,6,7,8,9,10;inta10=1,2,3,4,5,6,7,8,9,10;int*p1,*p2;int*p1,*p2;p1=a;p1
21、=a;p2=&a3;p2=&a3;coutp2-p1endl;coutp2-p1endl;p1=&a2;p1=&a2;p2=&a7;p2=&a7;coutp2-p1endl;coutp2-p1endl;程序运行结果为:程序运行结果为:3 5ap112345678910p2a0a1a2a3a4a5a6a7a8a9第23页/共60页3.3.指针作为函数的参数接收数组地址指针作为函数的参数接收数组地址指针作为函数的参数接收数组地址指针作为函数的参数接收数组地址n n数组名作为函数的参数实际上传递的是数数组名作为函数的参数实际上传递的是数组的首地址,进行的是组的首地址,进行的是地址传递地址传递,用指针
22、变用指针变量作函数参数量作函数参数,同样可以接收实参传来的数同样可以接收实参传来的数组首元素的地址组首元素的地址。例例6.66.6用选择法将用选择法将1010个整数按由小到大的顺个整数按由小到大的顺序排列。序排列。要求要求:将形参改为指针变量。将形参改为指针变量。第24页/共60页函数函数voidselect_sort(int*p,intn)/voidselect_sort(int*p,intn)/用指针变量作形参用指针变量作形参inti,j,k,t;inti,j,k,t;for(i=0;in-1;i+)for(i=0;in-1;i+)k=i;k=i;for(j=i+1;jn;j+)for(j
23、=i+1;jn;j+)if(*(p+j)*(p+k)k=j;/if(*(p+j)*(p+k)k=j;/用指针法访问数组用指针法访问数组t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;第25页/共60页#include#includeusingnamespacestd;usingnamespacestd;voidselect_sort(int*p,intn);voidselect_sort(int*p,intn);intmain()intmain()inta10,i;inta10,i;coutentertheorig
24、inlarray:endl;coutentertheoriginlarray:endl;for(i=0;i10;i+)for(i=0;iai;cinai;coutendl;coutendl;select_sort(a,10);select_sort(a,10);coutthesortedarray:endl;coutthesortedarray:endl;for(i=0;i10;i+)for(i=0;i10;i+)coutai;coutai;coutendl;coutendl;return0;return0;主程序主程序第26页/共60页说明说明n n用指针变量作形参,接收实参数组名,和数组名
25、作形参,本质上是一样的.C+编译系统将形参数组名一律作为指针变量处理.如:voidselect_sort(intarray,intn)处理为:voidselect_sort(int*array,intn)n n在函数调用时不存在占有内存空间的形参数组,只为指针变量分配空间,形参数组和实参数组共占同一段内存单元.第27页/共60页实参和形参的结合有实参和形参的结合有实参和形参的结合有实参和形参的结合有4 4种形式种形式种形式种形式实参实参形参形参数组名数组名数组名数组名数组名数组名指针变量指针变量指针变量指针变量数组名数组名指针变量指针变量指针变量指针变量注注:实参数组名是常量实参数组名是常量,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强 程序设计 指针
限制150内