版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 指 针C+程序设计中使用指针可以:l使程序简洁、紧凑、高效l有效地表示复杂的数据结构l动态分配内存l得到多于一个的函数返回值程序中: int i; float k; 内存中每个字节有一个编号-地址地址.2000200120022005内存02003 i k 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象1. 变量与地址一. 指针的基本概念.2000200420062005整型变量i10变量i_pointer200120022003v指针:一个变量的地址,它是一个整数形式的常量。v指针变量:专门用来存放地址的变量叫指针变量,它的值也可以是数组或函数的地址 。2000指针指针变
2、量 变量的内容 变量的地址2. 指针与指针变量含义: 取变量的地址单目运算符结合性:自右向左含义: 从某个地址中获取数据单目运算符结合性:自右向左两者关系:互为逆运算3. 取地址运算符&与指针运算符* *.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量20002000*i_pointer-指针的目标变量i,它的内容是数据10&i_pointer-指针变量占用内存的地址:20042004i_pointer &i &(*i_pointer)i *i_point
3、er *(&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、指针变量定义后,变量值不确定,应用前必须先赋值。二. 指针变量的定义与引用将地址值赋给指针变量例 int i; int *p=&i;变量必须已说明过;并要求两者类型一致。例 int *p=&i; int i;例 int i; int *p=&i; int *
5、q=p;用已初始化指针变量作初值例 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所加的数值:整数*字节
6、数 q=p-1; p+; +p; 注意:*p+; *+p; 不同于 (*p)+; + (*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定义:指针变量值为零 例如: in
7、t * p=0; p指向地址为0的内存单元;系统保证该单元不作它用;表示指针变量的值没有意义。#define NULL 0int *p=NULL;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中分配内存空间的函数返回一个空类型的指针。
8、 void *malloc(int n); 例如:int *p= (int *) malloc(2);main() int *p1,*p2,*p,a,b; a=5;b=9; p1=&a; p2=&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例例 按先大后小的顺序输出按先大后小的顺序输出a和和b两个整数。两个整数。
9、7. 多重指针 一个指针变量的内容就是内存中某个存储区域的地址,这个存储区域中存放的值可以是一个基本数据类型的数据,也可以是另一个存储区域的地址。我们把这种类型的指针叫做多重指针。二重指针(指向指针的指针)的一般说明形式为: 类型说明符 * * *指针变量名;二重指针的使用。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;.2000
10、2008200A20022004200610变量a 变量b(main)20 变量temp 变量y 变量x(swap)101020 1020COPY值传递运行结果:运行结果:10, 20不能达到预期的结果!8. 函数之间地址值的传递1. 形参为指针变量:传递的是指针变量的值-地址。 特点:共享内存, 相当于“双向”传递!例 将数从大到小输出(用变量作函数的参数)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
11、=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); coutab;.20002008200A200220042006200C200E2010.59整型变量a 整型变量b(main)指针pointer_1指针pointer_220002002(swap)指针p1指针p2整型p5920002002COPY5例 将数从大到小输出(用指针作函数的参数)void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*poin
12、ter_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_22000200259运行结果:9,5地址值传递例 将数从大到小输出(用指针作函数的参数)续void swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p;main() int a,b; int *po
13、inter_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(ab) swap(pointer_1,pointer_2); coutab;.20002008200A200220042006200C200E
14、2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指针p1指针p2指针p*2000地址传递20002002运行结果:运行结果:5,9也不能达到预期的结果!例 错误程序之三array0array1array2array3array9.整型指针p&array0p数组名是表示数组首地址的地址常量!三. 数组和指针 1. 一维数组和数组元素的地址一个整数在内存中占两个连续的存储单元,排在前面的那个存储单元的地址就是这个整数的地址;长整数、实数数组元素的地址同上。数组中的若干个数组元素在内存中是依次连续存放的,占一片连
15、续的内存单元,其中排在前面的那个数组元素的地址就是这个数组的地址。 例 数组以及各个数组元素在内存中的地址 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:&a 0 , 0 x12ff54, 4&a 1 , 0 x12f
16、f58, 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+
17、i)a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.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+)
18、 cout*(a+i):*(a+i)endl;for(i=0;i5;i+) coutpai:paiendl;for(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
19、=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,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
20、=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 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
21、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. 实参与形参均用指针变量例例 将数组将数组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 a
22、rray has been reverted:n; for(p=arr;parr+10;p+) cout*p;4. 实参用指针变量,形参用数组la+i=ai=*(a+i) =&ai0, 值相等,含义不同ua+i 表示第i行首地址,指向行uai *(a+i) &ai0,表示第i行第0列元素地址,指向列a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2l对二维数组 int a34,有ua-二维数组的首地址,即第0行的首地址ua+i-第i行的首地址uai *(a+i
23、)-第i行第0列的元素地址uai+j *(a+i)+j -第i行第j列的元素地址u*(ai+j) *(*(a+i)+j) aij5 指针与二维数组 1. 二维数组和数组元素的地址 表示形式含义地址a二维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值2000200020082008201213例 3个学生各学4门课,计算总平均分,并输出第n个学生成绩main() void average(float
24、 *p,int n); void search(float (*p)4,int n); float score34=65,67,79,60,80,87,90,81,90,99,100,98; average(*score,12); search(score,2);void average(float *p,int n) float *p_end, sum=0,aver; p_end=p+n-1; for(;p=p_end;p+)sum=sum+(*p); aver=sum/n; coutaverage=“aver;void search(float (*p)4, int n) int i; c
25、out No:“n; for(i=0;i4;i+) cout*(*(p+n)+i);列指针行指针函数说明float p46552796080879081909910098pp*(*(p+n)+i) pni例 3个学生各学4门课,计算总平均分,并查找一门以上课 不及格学生, 输出其各门课成绩void search(float (*p)4, int n) int i,j,flag; for(j=0;jn;j+) flag=0;for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1;if(flag=1) printf(No.%d is fail,his scores are:
26、n,j+1); for(i=0;i4;i+)printf(%5.1f ,*(*(p+j)+i); printf(n); main() void search(float (*p)4, int n); float score34=.,.,.; search(score,3);6552796080879081909910098p*(*(p+j)+i) pji例 main( ) char string=“I love China!”; coutstringendl; coutstring+7; IloveChistring0string1string2string3string4string5str
27、ing6string7string8string9stringstring10string11string12string13n!a01. 字符串表示形式(1) 用字符数组实现五 指针与字符串例 main( ) char *string=I love China!; coutstringendl; string+=7; while(*string) putchar(string0); string+; IloveChistringn!a0字符指针初始化:把字符串首地址赋给string相当于以下两个语句: char *string; string=I love China!;string*str
28、ing!=0(2) 用字符指针实现*string例 字符串复制(1)用字符数组 作参数void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi;i+; toi=0;main() char a=I am a teacher.; char b=You are a student.; coutstring_a=a string_b=b; copy_string(a,b); coutstring_a=a string_b=b;2. 用指向字符串的指针作函数参数例 实现字符串复制void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0;void main() char *a=I am a teacher.123456789; char b80=You are a student.; coutstring_a=aendl;cout string_b=bendl; copy_string(a,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5年(2021-2025)湖南高考政治真题分类汇编专题06 全面依法治国(原卷版)
- 液氢重卡配套应用可行性研究方案
- 2026年中考政治考前冲刺押题试卷及答案(五)
- 2026年网络信息安全知识竞赛试卷及答案(十四)
- 26年丙肝肝损风险评估指南
- 26年乙肝人群肝癌基因检测要点
- 26年石蜡样本采集质控落地细则
- BIM模型创建方案
- 26年HER2扩增检测与靶向用药适配
- 工程评价服务方案
- 2026年上海市浦东新区初三语文二模试卷及答案
- 2026河南兴豫惠民职业技能培训学校有限公司市场化招聘15人笔试参考题库及答案解析
- (二模)苏北七市2026届高三第二次调研测试英语试卷(含答案及解析)
- (完整版)2026年党建基础知识应知应会试题及答案
- DB31∕T 1624-2025 机器人智能化等级评价指南
- 2026年青年干部廉洁纪律要求应知应会知识库
- 北京市2024商务部中国国际电子商务中心招聘1人笔试历年参考题库典型考点附带答案详解
- 小额贷款消费者权益保护制度
- 危险化学品储存安全技术
- 第七章管道与阀门的使用与维护
- 船舶阻力阻力
评论
0/150
提交评论