




免费预览已结束,剩余30页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章 指 针,交实验报告168页1题 格式:按照上机指导书171页附录d格式书写 采用统一的实验报告纸,预 备 知 识,内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。,1. 内存的概念,地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。 通过地址我们就能够访问该地址所标 识的存储单元。,2. 地址的概念,变量的地址:变量在内存中总占用几个连续的 字节,开始字节的地址,就是变量的地址。,2007,存储单元,main() int ia, ib, ic; float fx, fy, fz; ia=ib=3; fx=fy=4.0; ic=ia+ib; fz=fx+fy; ,8.1什么是指针,指针就是变量的地址 e.g. fx 的地址为1000,那么1000就是fx的指针。也可以说,1000指向fx。 e.g. ia的地址为1500,那么1500就是ia的地址。也可以说,1500指向ia.,指针不仅仅是变量的地址,还包含了其指向变量的类型信息. e.g. 1000是fx的指针,其指向1000开始的浮点数。 e.g. 1500 是ia的指针,其指向1500开始的整数.,直接访问与间接访问 直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,例 i=3; -直接访问,3,例 int i=3,*p;p= -间接访问,8.2 指针变量,定义指针变量的说明, 变量名p前面的“*”不能省略,如写成 int *p1, p2; 则p2被定义为整型变量,而非整型指针变量。,用来指定该指针变量可以指向的变量的类型。 在定义指针变量时必须指定基类型。(因为不同类型的变量在内存中所占字节数不同,这就涉及到指针移动时,移动一步越过几个字节的问题),把一个整型变量的地址赋给一个指针变量,即实现指向。,定义中的“*”表示所定义的变量是指针变量,但指针变量名是p1、p2,而非*p1、*p2。,指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的“基类型”。,如上例中p只能指向整型变量,不能指向实型或字符型变量。其“基类型”相同,是整型。,定义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量。如int i, *p ;p=,由此可见:通过指针运算符“*”可以引用一个变量。 如:当p已经指向变量i后,*p就等同于i。 *ptr=15 ; 等价于 i=15 ;,二、指针变量的引用,printf(“%d,%dn”,i,*p); scanf(“%d ,%dn”,例1: main() int a,b,*p1,*p2; a=100;b=10; p1= 运行结果:100,10 100,10,例2:输入a和b两个整数,按先大后小的顺序输出。 main() int a,b,*p1,*p2,*p; scanf(“%d”,三、指针变量作为函数参数,例1:编写实现两个数的交换的函数,作用:将一个变量的地址传送到另一个函数中。,swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; main() int a,b,*p1,*p2; p1= ,例4:编写函数,根据传送过来的运算符,对传送过来的两个浮点数进行+、-、*、/运算,把结果传回调用函数(不用return语句)。,xx(char m,float *p1,float *p2,float *p3) if (m=+) *p3=*p1+*p2; else if(m=-) *p3=*p1-*p2; else if(m=*) *p3=(*p1)*(*p2); else *p3=(*p1)/(*p2); main() float a,b,s,*z,*x,*c;char y; z=,8.3 通过指针引用数组,c规定:,数组名代表数组的首地址(起始地址). 如:int a10,*p ; 则:p=a ; 与 p=等价 称指针变量p指向数组元素a0,指针变量p指向数组时,p+1指向数组的下一个元素。 p+i、a+i 、&ai 都是ai的地址。,二、数组元素的引用,例1:通过数组名计算数组元素地址,找出元素的值。 main() int a10=54,65,8,2,3,56,8,21,57,98,i; for(i=0;i10;i+) printf(“%4d“,*(a+i); ,例2:用指针变量指向数组元素利用指针变量效率最高。 main() int a10=54,65,8,2,3,56,8,21,57,98,*p,i; p=a; for(i=0;i10;i+) printf(“%4d“,*p+);,(1)指针变量与数组名的区别:指针变量是地址变量,数组名是地址常量。即指针变量的内容可以在程序运行过程中被改变;数组名一旦被定义,它的值就不能被改变了。,但前面用a+i表示第二个元素的地址,因为a的值没变。而a+表示a=a+1,不能给常量赋值,利用指针变量编程时特别要注意指针变量 的当前值。,应插入语句 p=a;,三、数组名作函数的参数,例如: f(int arr,int n) main() int array10; f(array,10); ,能接受并存放地址值的只能是指针变量。c编译系统都是将形参数组名作为指针变量来处理的。 例中f(int arr ,int n) 等价于 f(int *arr, int n) 。使用形参数组的概念只是为了与实参数组对应,直观,便于理解而已。,例:从10个数中找出其中最大值和最小值。,main() void max_min(int a,int n,int *p1,int *p2); int i,b10=2,4,1,6,7,32,45,75,45,90,max,min; max_min(b,10, ,main() void max_min(int *x,int n,int *max,int *min); int i,b10=2,4,1,6,7,32,45,75,45,90,max,min; max_min(b,10, x+ ,上例中如果形参数组用指针变量,则程序如下:,实参与形参都用数组名;,实参用数组名,形参用指针变量;,例:实参、形参都用指针变量的形式,main() int a10,*p; p=a; f(p,10); ,f(int *x, int n) ,例:实参为指针变量,形参用数组名。,main() int a10,*p; p=a; f(p,10); ,f(int x , int n) ,对于二维数组: (1)a是数组名, 包含三个元素 a0,a1,a2 (2)每个元素ai 又是一个一维 数组,包含4个 元素,int a34;,基类型,行指针与列指针,四、多维数组与指针,对二维数组 int a34,有 a-二维数组的首地址,即第0行的首地址 a+i-第i行的首地址 ai *(a+i)-第i行第0列的元素地址 ai+j *(a+i)+j -第i行第j列的元素地址 *(ai+j) *(*(a+i)+j) aij,a+i=&ai=ai=*(a+i) =&ai0, 值相等,含义不同 a+i &ai,表示第i行首地址,指向行 ai *(a+i) &ai0,表示第i行第0列元素地址,指向列,二维数组元素表示形式: (1)a12 (2)*(a1+2) (3)*(*(a+1)+2) (4)*(&a00+1*4+2),地址表示: (1) a+1 (2) &a10 (3) a1 (4) *(a+1) (5)(int *) (a+1),地址表示: (1) &a12 (2) a1+2 (3) *(a+1)+2 (4)&a00+1*4+2,例题:用指针变量输入输出二维数组中的元素。,main() int a23,*p,i,j; for(i=0;i2;i+) p=ai; for(j=0;j3;j+) scanf(“%d”,p+j); printf(“%d”,*(p+j); ,分别把第0行第1行的起始地址放入p中,因为a0,a1是一行的起始地址,其中每行还包含有三个元素:a00a01a02, p=a0只是把第0行的起始地址给p,此时p+1表示第0行第1列的那个元素(a01)的地址,所以p+j分别表示第0行各元素的地址。要想使p指向第二行,必须重新赋给p第二行的首地址。 p=a1,指向一维数组的指针变量 定义形式: 数据类型 (*指针名)一维数组维数; 例 int (*p)4;,( )不能少 int (*p)4与int *p4不同,p的值是一维数组的 首地址,p是行指针,可让p指向二维数组某一行 如 int a34, (*p)4=a;,一维数组指针变量维数和 二维数组列数必须相同,例题 一维数组指针变量举例,main() static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i,j,(*p)4; p=a; for(i=0;i3;i+) for(j=0;j4;j+) printf(“%d “,*(*p+j); p+; , p0j,8.4 通过指针引用字符串,定义了一个指向字符串的指针变量,并将字符串的首地址赋值给strp指针变量,即:使指针变量strp指向字符串首地址。,c程序访问字符串有以下两种方法:,2用字符指针指向一个字符串,例如:char *ps=“i am a student.“; 字符串输出语句可写成: printf(“%sn”, ps);*以字符串形式输出时写字符串的地址*,说明:,字符数组由若干个元素组成,每个元素中放一个字符。而字符指针变量中存放的是字符串的首地址,不是将字符串放到字符指针变量中。例如: char *ps=“i am a student.“;,字符数组和字符指针变量都可以在定义时赋初值。 char s10; s=“hello!”; char s10=“hello” ; =char s10=h,e,l,l,o,0; char *ps; ps=“hello!”; =char *ps=“hello”;,字符指针变量必须先赋值后使用,否则对系统构成危险。 char *ps; scanf(“%s”, ps); char *ps,s10; ps=s; scanf(“%s”, ps); ,字符数组名是指针常量,只能表示一个确定的字符串,不能改变。字符指针变量的值是可改变的。,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指字符串中的字符。 如:char *a=“i love china!”;printf(“%c”,a5);,用指针变量指向一个格式字符串,可以用它代替printf函数的格式字符串。 如:int a; char *format; format=“a=%dn”; 则:printf(format,a);相当于printf(“a=%dn”,a);,main() char *a=“i am a student”; a=a+7; printf(“%s”,a); 结果:student,main() char c=“i am a student”; c=c+7;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 奥运跳水知识题库及答案
- 2025云南国内旅游合同范本(合同版本)
- 自考心理统计题库及答案
- 《工程项目管理原理》教案-第7章 工程项目投标
- 全球低空经济2025年航空器乘客安全标准白皮书
- 知道影视剪辑题库及答案
- 聚焦2025:多式联运信息平台功能提升与城市协同发展研究报告
- 2025年gmp训练试题及答案
- 2025年管道保温试卷及答案
- 教师招聘之《幼儿教师招聘》考前冲刺练习题含答案详解(能力提升)
- 2025年中国电信招聘考试行政职业能力测试预测题集
- 静脉治疗知识培训课件
- 学风建设科研诚信宣教课件
- 2025繁轩科技发展(天津)有限公司公开招聘工作人员35人备考题库及答案解析
- 2025年度水电项目工程结算与审计服务协议
- 德育副校长在新学期德育工作部署会讲话范文
- (2025年标准)学生玩耍纠纷协议书
- 《机械制图(多学时)》中职全套教学课件
- 2024过敏性休克抢救指南(2024)课件干货分享
- 遥感大数据应用解决方案课件
- (精选word)洪恩识字-生字卡片1-200
评论
0/150
提交评论