(精品)C++指针.ppt
《(精品)C++指针.ppt》由会员分享,可在线阅读,更多相关《(精品)C++指针.ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章 指针C+程序设计中使用指针可以:l使程序简洁、紧凑、高效l有效地表示复杂的数据结构l动态分配内存l得到多于一个的函数返回值程序中:int i;float k;内存中每个字节有一个编号-地址地址.2000200120022005内存02003 i k 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象1.变量与地址6.1 指针的基本概念.2000200420062005整型变量i10变量i_pointer200120022003v指针:一个变量的地址,它是一个整数形式的常量。v指针变量:专门用来存放地址的变量叫指针变量,它的值也可以是数组或函数的地址。2000指针指针变量
2、变量的内容 变量的地址指针变量变量变量的地址(指针)变量的值指向地址存入指针变量2.指针与指针变量含义:取变量的地址单目运算符优先级:14(第二高的级别)结合性:自右向左含义:从某个地址中获取数据单目运算符优先级:14结合性:自右向左两者关系:互为逆运算3.取地址运算符&与指针运算符*.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量20002000*i_pointer-指针的目标变量i,它的内容是数据10&i_pointer-指针变量占用内存的地址:20042004i_pointer&i
3、&(*i_pointer)i *i_pointer *(&i)指针运算符示例=例 i=3;-直接访问指针变量.2000200420062005整型变量i10变量i_pointer20012002200320003例 *i_pointer=20;-间接访问20v直接访问:按变量地址存取变量值v间接访问:通过存放变量地址的变量去访问变量4.直接访问与间接访问1.指针变量与其所指向的变量之间的关系2.指针变量的定义v一般形式:存储类型 数据类型 *指针名;3变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法标识符指针变
4、量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是乘法运算符*例 int*p1,*p2;float *q;static char *name;注意:1、int *p1,*p2;与 int *p1,p2;不一样。2、指针变量名是p1,p2,不是*p1,*p2。3、指针变量只能指向定义时所规定类型的变量。4、指针变量定义后,变量值不确定,应用前必须先赋值。6.2 指针变量的定义与引用将地址值赋给指针变量例 int i;int *p=&i;变量必须已说明过;并要求两者类型一致。例 int *p=&i;int i;例 int i;int *p=&i;int *q=p;用已初始化指针变量作初值
5、例 main()int i;static int *p=&i;().不能用auto变量的地址去初始化static型指针一般形式:存储类型 数据类型 *指针名=初始地址值;3.对指针变量的操作(1)指针变量的初始化3.对指针变量的操作(续)(2)指针变量+/-整数新的地址int a,b,c,d,*p,*q;p=&b;q=p+1;.20002008200A200220042006200C200E2010.59整型变量a 整型变量b 整型变量c 整型变量d202259 指针变量p 指针变量q20022004所加的数值:整数*字节数 q=p-1;p+;+p;注意:*p+;*+p;不同于(*p)+;+(
6、*p);(3)指针变量-指针变量 整数(多少个数)q-p 1;(4)关系运算 pq 1;p=q 0;例 main()int i=10;int *p;*p=i;cout*p;危危险险!例 main()int i=10,k;int *p;p=&k;*p=i;cout*p;.2000200420062005整型变量i10指针变量p200120022003随机值4.指针变量必须先赋值,再使用!零指针与空类型指针v零指针:(空指针)l定义:指针变量值为零 例如:int *p=0;p指向地址为0的内存单元;系统保证该单元不作它用;表示指针变量的值没有意义。#define NULL 0int *p=NULL
7、;lp=NULL与未对p赋值不同l用途:u避免指针变量的非法引用u在程序中常作为状态比较 例 int *p;.while(p!=NULL).5.零指针一般形式:void *类型指针;例如:void *p;表示不指定p是指向哪一种类型数据的指针变量。使用时要进行强制类型转换。6.空类型指针例 char *p1;void *p2;p1=(char *)p2;p2=(void*)p1;TC中分配内存空间的函数返回一个空类型的指针。void *malloc(int n);例如:int*p=(int*)malloc(2);main()int*p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=
8、&b;if(ab)p=p1;p1=p2;p2=p;coutab;coutmax=min=*p1*p2;运行结果:5,9a=5,b=9max=9,min=5.指针变量p1 指针变量p20002010200220042008 指针变量p2 整型变量b 整型变量a5200892010200820102008例例6.3 按先大后小的顺序输出按先大后小的顺序输出a和和b两个整数。两个整数。7.多重指针 一个指针变量的内容就是内存中某个存储区域的地址,这个存储区域中存放的值可以是一个基本数据类型的数据,也可以是另一个存储区域的地址。我们把这种类型的指针叫做多重指针。二重指针(指向指针的指针)的一般说明形式
9、为:类型说明符 *指针变量名;二重指针的使用。main()int*p1,*p2,i=10;p1=&i;p2=&p1;void swap(int x,int y)int temp;temp=x;x=y;y=temp;void main()int a=10,b=20;if(ab)swap(a,b);coutab;.20002008200A20022004200610变量a 变量b(main)20 变量temp 变量y 变量x(swap)101020 1020COPY值传递运行结果:运行结果:10,20不能达到预期的结果!6.3 函数之间地址值的传递1.形参为指针变量:传递的是指针变量的值-地址。特
10、点:共享内存,相当于“双向”传递!例6.5 将数从大到小输出(用变量作函数的参数)void swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;a=5;b=9;pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);coutab;.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针
11、p1指针p2整型p5920002002COPY5例6.5 将数从大到小输出(用指针作函数的参数)void swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;a=5;b=9;pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);coutab;.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_2200020025
12、9运行结果:9,5地址值传递例6.5 将数从大到小输出(用指针作函数的参数)续void swap(int*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;main()int a,b;int*pointer_1,*pointer_2;a=5;b=9;pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);coutaab;pointer_1=&a;pointer_2=&b;if(ab)swap(*pointer_1,*pointer_2);coutaab;pointer_1=&a;pointer_2=&b;if
13、(ab)swap(pointer_1,pointer_2);coutab;.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指针p*2000地址传递20002002运行结果:运行结果:5,9也不能达到预期的结果!例6.5 错误程序之三array0array1array2array3array9.整型指针p&array0p数组名是表示数组首地址的地址常量!6.3 数组和指针 1.一维数组和数组元素的地址一个整数在内存中占两个连续的存储单元
14、,排在前面的那个存储单元的地址就是这个整数的地址;长整数、实数数组元素的地址同上。数组中的若干个数组元素在内存中是依次连续存放的,占一片连续的内存单元,其中排在前面的那个数组元素的地址就是这个数组的地址。例6.7 数组以及各个数组元素在内存中的地址 void main()int i,a10;cout index,Address,size:n;for(i=0;i 10;i+)cout&a i,&ai sizeof(ai)endl;cout Address of a=aendl;cout size of a=sizeof(a)endl;程序运行结果如下(VC):index,Address,size
15、:&a 0,0 x12ff54,4&a 1,0 x12ff58,4&a 2,0 x12ff5c,4&a 3,0 x12ff60,4&a 4,0 x12ff64,4&a 5,0 x12ff68,4&a 6,0 x12ff6c,4&a 7,0 x12ff70,4&a 8,0 x12ff74,4&a 9,0 x12ff78,4Address of a=0 x12ff54size of a=40 在C+语言中,一维数组的任何一个元素的地址,都可以用其数组名加上一个偏移量来表示。即:&aia+i*&ai ai*(a+i)a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2
16、a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)ai pi *(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p92.通过指针引用数组元素 int a10,*p=&a0;a=a+1;a+;p=p+1;p+;a0a1a2a3a4void main()int a5,*pa,i;for(i=0;i5;i+)ai=i+1;pa=a;for(i=0;i5;i+)cout*(pa+i):*(pa+i)endl;for(i=0;i5;i+)cout*(a+i):*(a+i)endl;for(i=0;i5;i+)coutpai:paiendl;fo
17、r(i=0;i5;i+)coutai:aiendl;12345pa例例 数组元素的引用方法数组元素的引用方法v数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量3.数组名数组名或或指针指针作形参作形参 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723void inv(int x,int n)int t,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()int i,a10=3,7,9,11,0,6,7,5
18、,4,2;inv(a,10);coutThe array has been reverted:n;for(i=0;i10;i+)coutai;coutendl;m=4例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放1.实参与形参均用数组例 将数组a中的n个整数按相反顺序存放 void inv(int *x,int n)int t,*p,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;main()int i,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);coutThe
19、array has been reverted:n;for(i=0;i10;i+)coutai;coutendl;2.实参用数组,形参用指针变量例 将数组a中的n个整数按相反顺序存放 void inv(int*x,int n)int t,*i,*j,*p,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;main()int i,a10,*p=a;for(i=0;i*p;p=a;inv(p,10);coutThe array has been reverted:n;for(p=a;pa+10;p+)cout*p;3.实参与形参均
20、用指针变量例例 将数组将数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放 void inv(int x,int n)int t,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()int i,a10,*p=a;for(i=0;i*p;p=a;inv(p,10);coutThe array has been reverted:n;for(p=arr;parr+10;p+)cout*p;4.实参用指针变量,形参用数组int *p 与 int q10 数组名是指针(地址)常量p=q;p+i 是qi的地址数组元素的表示方法:下标
21、法和指针法,即若p=q,则 pi qi *(p+i)*(q+i)形参数组实质上是指针变量,即int q int*q在定义指针变量(不是形参)时,不能把int *p 写成int p;系统只给p分配能保存一个指针值的内存区(一般2字节);而给q分配2*10字节的内存区一级指针变量与一维数组的关系la+i=ai=*(a+i)=&ai0,值相等,含义不同ua+i 表示第i行首地址,指向行uai *(a+i)&ai0,表示第i行第0列元素地址,指向列a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 C+ 指针
限制150内