第六章 指针和引用1.doc_第1页
第六章 指针和引用1.doc_第2页
第六章 指针和引用1.doc_第3页
第六章 指针和引用1.doc_第4页
第六章 指针和引用1.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 指针第六章 指针61 指针611 指针及指针变量的概念 例:int a=20 , b=30 , c=50,d ;int *p,*x; (*表示定义指针变量)p=&a; (&表示取出变量的地址)d=*p; (在赋值语句中,*表示取出地址中的内容)x=&p;物理地址(假定) 内存单元内容 变量2000 20 a2002 30 b2004 50 c 3000 2000 p 4000 3000 x 1变量的指针:变量的地址(如:变量a 的地址是2000,用&a表示,变量c 的地址是2004,用&c表示)(可以用人与房间作比喻)2变量的内容:就是变量指针所指内容。(如:a=*p=*(&a)=20)3指针变量:存放变量地址的变量。(p=2000)4指针的指针变量:存放着另一个指针变量的地址(如:x中存放的是3000)。看上例,请回答下列问题:a= ?&a= ?p= ?*p= ?&p= ?x= ?&x= ?*x= ?*x= ?612 指针变量的定义int a,b,c,p1,*p2,*x;float *p3,*p4;说明:指针变量也有类型,不同类型的指针变量指向不同类型的数据地址。注意,定义时,*p 表示指针变量,但在使用时 ,*p 表示的是非指针变量613 指针变量的访问例1:通过指针变量输出两个变量的值要点:完成变量地址向变量指针的传递#include “iostream.h”main()int a=3,b=5; int *pa, *pb; /* 定义时,*pa 是指针变量*/pa=&a; pb=&b; /* 使用时,pa 是指针变量*/ cout“a=”*pa”t”b=”*pb; /* 使用时,*pa 是指针变量中的地值中的值*/例2:利用指针变量,将两个整型数中较大的数输出。要点:使用指针变量实现#include “iostream.h”main()int a=3,b=5; int *pa=&a, *pb=&b;cout*pb ? *pa : *pb)endl; 例3:利用指针变量,将两个变量中值互换。要点:使用变量指针实现A30005方法一:(值交换)#include “iostream.h”main() int a=3,b=5,c;B30023 int *pa, *pb; pbpa=&a,pb=&b; c=*pa;*pa=*pb;*pb=c; cout“a=”*pa”t”b=”*pb; b30025方法二:(地址交换)main() int a=3,b=5;a30003 int *pa,*pb,*p; pa=&a,pb=&b; p=pa;pa=pb;pb=p; cout“a=”t”b=”*pb;614 指针变量的运算 main()int *p1, *p2,m=3,n=5; p1=&m; p2=&n; p1+; *p2+; *+p2; +*p1; coutp1*p2*p1*p1 ) coutp1) coutp2;615 指针变量用做函数中的实参和形参例:利用子函数实现两个变量的交换先看一个错误的程序(实参与形参的结合,只能单向传递数据,被称为值传递)#include “iostream.h”main()int a=3,b=5;swap(a,b); cout“a=”a”t”b=”b;int swap(int a,int b) (其值不能返回实参)int c; c=a;a=b;b=c;正确程序:(指针变量可以实现数据双向传递,成为地址传递)方法一:#include iostream.h void main()int a=3,b=5; int *p1,*p2; void swap(int *a,int *b);p1=&a,p2=&b;swap(p1,p2); couta=*p1tb=*p2;void swap(int *a,int *b)int c; c=*a;*a=*b;*b=c; /(地址没变,地址中的值交换)6.2 指针与数组621 用指针访问一维数组元素 例:int *p,a10;p=a; (或 p=&a0;) (p就是数组的指针变量) 说明:引用数组的5中方法:(包括字符串数组) ai; *(a+i) ; pi; *(p+i); *p+例:用指针实现一维数组的输入输出 #include “iostream.h” #include “iomanip.h” void main() int arr10,*ap=arr,i; for(i=0;i10;i+) *ap+=i+1; ap=arr; for(i=0;i10) coutsetw(4)*ap+; coutendl; 例:用5种方法向数组a5输入数值,并完成输出。 方法1: #include “iostream.h”main() int i,a5; for(i=0;i5;i+) cinai);for(i=0;i5;i+) cout ai); 方法 2:cout*(a+i);方法 3: #include “iostream.h”main() int i,a5, *p; p=a; for(i=0;ipi; for(i=0;i5;i+,p+) cout*p;p=a;for(i=0;i5;i+,p+) cout*p; 方法4:cout*p+方法5:cout*(p+i);622 用指针访问二维数组元素1 二维数组的地址表示二维数组的方法: aij *(*(a+i)+j) 表示0行0元素内存地址的方法: a, *a, a0, *(a+0), &a0, &a00表示1行0元素内存地址的方法: a+1, a1, &a10, *(a+1)+0, &a12 代替二维数组的指针变量 #include iostream.h void main() int *p; int a34=1,2,3,4,5,6,7,8,9,10,11,12; p=&a00; for(;pa0+12;p+) if (p-a0)%4=0) coutn; cout*p” “; 问题:*(p+5) = a 1 0623 指针与字符串(字符串指针和指向字符串的指针变量)1 字符串的初始化及输出方法一:#include iostream.h main()static char str10=“zhengzhou”; /字符串初始化。 coutstr; coutstr; 2 字符串指针的初始化及输出#include iostream.h main() static char str10=“zhengzhou”; char *p; p=str; coutp; / 与*p不同。 例: 将字符串a20复制到字符串b20 方法一:#include iostream.h main() static char a20=“zhengzhou”,b20; int k; for(k=0;ak;k+) bk=ak; bk=0; coutb;方法二:#include iostream.hvoid main() static char a20=zhengzhou,b20; int k; for(k=0;ak;k+) *(b+k)=ak; bk=0; coutb; 方法三:#include iostream.h main()static char *p=zhengzhou,b20; int k; for(k=0; *p; k+,p+) bk=*p; bk=0; coutbendl;624 指针数组一个指针数组就是一个二维字符串数组.例: 用指针数组对若干英文单词排序 方法:1. 定义指针数组及初始化char *name5=“hello”,follow”,”file”,”disk”,”command”;2. 按一维数组使用方法排序#include iostream.h#include string.hvoid swap(char *p1 , int k1,int k2)char *p; strcpy(p,p1k1); strcpy(p1k1,p1k2);strcpy(p1k2,p);void main()int k,j;char *name5=hello,follow,file,disk,command;for(k=0;k4;k+) for(j=k+1;j0) swap(name,k,j); for(k=0;k5;k+) coutnamekendl;625数组指针用一维数组的指针变量代替二维数组,每一个元素指向二维数组的每一行。 例:用数组指针输出二维数组的内容的另外三种方法方法1:#include iostream.hvoid main() int i,j,(*p)4; static int a34=1,2,3,4,5,6,7,8,9,10,11,12; p=a; for(i=0;i3;i+) for(j=0;j4;j+) cout*(*(p+i)+j)endl; coutendl;方法2:pij, 方法3:*(pi+j)63 数组名和数组的指针变量作函数的参数 数组名和数组的指针变量作函数的参数有下列4种方法: 调用函数(实参) 被调用函数(形参) 数组 数组 数组 数组指针 数组指针 数组 数组指针 数组指针 例:用以上四种方法分别实现数组反置。 例将 5,2,7,3,4,6 反置后为 6,4,3,7,2,5 方法1:数组的值可以实现地址传递#include iostream.h void con(int a) int k,c; for(k=0;k3;k+) c=ak;ak=a5-k;a5-k=c; void main() static int a6=5,3,5,1,2,4; con(a); for(int i=0;i6;i+) coutaiendl; 方法2:在函数中用指针代替数组 #include iostream.hmain() int i,a6=5,2,7,3,4,6; void contrary(int *p); contrary(a); for(i=0;i6;i+) cont,aiendl; void contrary(int *p) int k; for(k=0;k3;k+) c=pk; pk=p5-k; p5-k=c; 方法3:在调用函数和被调用函数中都用指针代替数组#include iostream.hvoid main() int i,a6=5,2,7,3,4,6, *pm; pm=a; void contrary(int *p); contrary(pm); for(i=0;i6;i+) coutai; void contrary(int *p) int k; for(k=0;k3;k+) c=pk; pk=p5-k; pk=c; 方法4:实参采用指针#include iostream.hmain() int i,a6=5,2,7,3,4,6; int *p=a; contrary(p); for(i=0;i6;i+) countpi; contrary(int b6) int k; for(k=0;k3;k+) c=bk; bk=b5-k; bk=c; 64 字符串数组和字符串指针作函数参数用字符串数组和字符串指针变量作函数的参数有下列4种情况 调用函数(实参) 被调用函数(形参) 字符串数组 字符串数组 字符串数组 字符串数组指针 字符串数组指针 字符串数组字符串数组指针 字符串数组指针例:将字符串from 拷入字符串 to 方法一: void copychar form , char to int k; for(k=0;fromk;k+) tok=fromk; tok=0; 方法二: void copychar *form, char *to for(; *from; ) *to+=*from+; *to=0; 方法三: copychar *form, char *to while (*from) *to+=*from+;*to=0; #include iostream.hmain()char a10=“hello”, b10,*pa,*pb;pa=a;pb=b; copy(pa,pb); coutpaendl; coutpbendl;6.5 指针与函数用指针变量代替函数。使用函数指针变量四步骤:1定义或说明函数;2说明函数指针;3函数指针变量赋初值;4使用函数时,将函数名用指针变量即可。例:求m,n 的和add(int, int);main()(int m=2, n=3, (*p)(); p=add; coutjcheng 5方法:1. 编写具有脱离VC环境能执行的程序2. 在VC下将程序编译成 jcheng.exe文件3. 进入DOS环境, 执行jcheng.exe 文件即可程序:#include main(int argc,char *argv) long f(int); if (argc!=2) cout”input error”; return 1; cout”n!=”f(atoi(argv1)endl; return 0; long f(int n) if (n=0) return 1; return (n*f(n-1); 说明: 其中,argc 存放的是命令的项数,argv 中存放的是命令中的每一个字符串。将该程序用 jcheng.cpp 文件名保存且编译。67

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论