版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 指针.8.1 变量的地址和指针2.数据在内存中的存储方式: 按数据类型在内存为其分配一定数量的存储单元(字节)。1.内存单元的地址: 计算机的内存是以字节为单位的一片延续的存储空间,每一个字节都有一个编号,这个编号就称为内存地址3.内存单元的内容: 即变量的值。.例如有定义: short int a,b; char c; float x; 变量a,b,c,x的内存分配情况:abxc200020012002200320042005200620072021 每个变量的地址是指该变量所占存储单元的第一个字节的地址,称为指针。.4. 计算机中数据存取方式A、变量的“直接访问方式: 按变量的地址
2、存取变量值的方式。(见以下图)i20003直接访问:编译器自动完成.3i20002000pointer间接访问方式表示图: 将变量的地址放在另一个特殊的变量中,先到另一个变量所表示的存储单元中获得变量的地址,再由变量的地址找到变量并进展数据存取(见以下图)。b.变量的“间接访问方式变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向 i。.6.指针的概念:一个变量的首地址称为该变量的指针。用来专门存储变量指针的变量称为指针变量。.8.2 指针与变量一. 指针变量的定义1. 定义方式: 类型标识符 *指针变量名1,*指针变量名2 ;例:float *p1; (定义了p
3、1为指向实型变量的指针变量) char *p2; (定义了p2为指向字符型变量的指针变量) . 标识符前面的“*,表示该变量为指针 变量。但指针变量名是*后面的名字不包括“*。3.阐明2. 指针变量的三要素:指针变量的基类型: 和其所指变量的类型一致;指针变量的值:另一个变量在内存的地址;指针变量的名字:符合用户标识符规那么。 .指针变量名=某一地址;8.3.指针变量的赋值方式1: 指针变量名=&变量名;方式2: 指针变量名=另一曾经赋值的指针变量;方式3: 经过规范的库函数malloc和calloc在内存中开辟动态存储单元.i的地址pi的值iqi的地址例如: int i,*p,*q; p=&
4、i; /*方式1*/ q=p; /*方式2*/表示图.阐明:给指针变量赋“空值除了给指针变量赋地址值外,还可以给指针变量赋NULL值。如:p=Null;Null是在stdio.h头文件中定义的预定义符。在运用前必需运用预定义行:#include 。Null的代码值为0,当执行以上赋值语句后,称p为空指针。等价于:p=0 ; 或 p=0留意:这时指针p不是指向地址为0的存储单元,而是一个具有一个确定的值“空。企图经过一个空指针去访问一个存储单元,将会得到一个出错信息。.国家等级考试练习1.知 int a=3, a的地址为1001,那么&a= ?10012.设有定义:float x; 那么以下对指
5、针变量p进展定义且赋初值的语句中正确的选项是:a) float *p=1024; b) int *p=(float)x; c) float p=&x d) float *p=&xD.4.有以下程序段#include main() int n,*p=NULL; *p=&n; scanf(“%d,&p); printf(“%dn,p);该程序试图经过P为变量n读入数据并输出,但程序有多出错误,以下语句正确的选项是: n,*p=NULL b.*p=&n c.scanf(“%d,&p) d.printf(“%dn,p);A.8.4.对指针变量的操作1.经过指针来援用一个存储单元 C言语提供了
6、一个称作“间接访问运算符(间接运算符的单目运算符:“*,当指针变量有确切的地址值时,就可以经过间接访问运算符援用该地址指向的存储单元。如: int *p,i=10,j; p=&i; j=*p; 阐明:把p所指向的存储单元i的值赋给j,*p代表p所指向的变量i,以上语句等价于: j=i;.分析以下表达式的含义:j=*(&i); j=*p+1;*p=100; *p+=1;+*p; (*p)+; int *p,i=10,j; p=&i; j=*p; 例子:例8.1.2.算术运算(挪动指针 例如: int *p,i; char *q , c; p=&i;q=&c;.i10001001100220002
7、001cpq.i10001001100220002001cpq /*运算例如*/ p+;q+; 对指针进展加减运算时,数字“1不代表十进制整数“1,即不是挪动一个字节,而是挪动一个存储单元长度。.例如:右图1 pq为假。.i10001001100220002001cpq.400040014002400340184019pqa0a1a9例如:右图2int a10;int *p,*q;p=&a0; /*或p=a;*/q=&a9;/*或q=a+9;*/求pq为真为假?2.比较运算.例 main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer
8、_1=&a;pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);程序运转结果: 100,10 100,10.思索:1.假设已执行了“pointer_1=&a,那么: “&*pointer_1的含意是什么? (答:相当于&a )2. *&a的含意是什么? (答:a )3. (*pointer_1)+相当于什么? (答:a+ ).例对输入的两个整数按大小顺序输出main()int *p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;&a59p1p2&bab(1 初始)2 执行p=p1后&a5
9、p1a&b9p2b&apif (ab) p=p1;p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);&b&b3 执行p2=p1后&ap9p1p25ab4 执行p2=p后5&a&b&a9pp1p2ab.-指向指针变量的指针.定义方式: 类型 *变量名;例如: int i,*p,*q; i=30; p=&i; q=&p;100020001000100120003000ipq 内存表示图:指针的指针.国家等级考试练习:1.设有定义:int n1=0,n2,*p=&n2,*q=&n1,以下赋值语句中与n2=n1;语句
10、等价的是:a. *p=*q; b.p=q c.*p=&n1 d. p=*qA2.假设有阐明语句:double *p,a;那么能经过scanf语句正确给输入项读入数据的程序段是:a.*p=&a;scanf(“%lf,p); b.*p=&a; scanf(“%f,p);c.p=&a;scanf(“%lf,*p); d.p=&a;scanf(“%lf,p);D3.已定义以下函数int fun(int *p)return *p;fun函数的前往值是:a.不确定的值 b.一个整数 c.形参p中存放的值 d.形参p的地址值 B.8.5 函数之间的地址值传送1.形参为指针变量时实参和形参之间的数据传送 假设
11、函数的形参为指针类型,调用该函数时,对应的实参必需是基类型一样的地址值或者是已指向某个存储单元的指针变量。例.编写函数myadd(int *a,int *b),函数中把指针a和b所指向的存储单元中两个值相加,然后将和的值作为函数值前往。#include int myadd( int *a,int *b) int sum; sum=*a+*b; return sum;main() int x,y,z; printf(“enter x,y:);scanf(“%d%d,&x,&y);z=myadd(&x,&y);printf(“%d+%d=%dn,x,y,z);思索:假设在被调函数中改动形参的值将如
12、何呢?.2.经过传送地址值在被调用函数中直接改动调用函数中变量的值#include “stdio.hVoid swap(int *,int *);Void main() int x=30,y=20; printf(“(1) x=%d y=%dn,x,y); Swap(&x,&y); printf(“(4) x=%d y=%dn,x,y); Void swap(int *a,int *b) int t; printf(“(2) a=%d b=%dn,*a,*b); t=*a;*a=*b;*b=t; printf(“(3) a=%d b=%dn,*a,*b);输出结果:x=30 y=20a=30
13、b=20a=20 b=30(4) x=20 y=30.例:8.4void swap(int *x1,int *x2)void order(int *a,int *b).3. 指针函数函数前往地址值1. 一个函数可以带回整型值、实型值、字符型值,也可以带回指针类型的数据,即地址。 前往值是指针类型的函数,称为指针函数。2. 普通定义方式为: 类型标识符 *函数名参数表; 例如: int *a(int x,float y) .3.阐明对于定义: int *a(int x, float y) a是函数名,调用它后能得到一个指向整型数据的指针地址。x,y是函数a的形参。这个函数前面有一个*,表示此函数是指针类型函数函数值是指针。.main()int a,b,*p; int *max( );scanf(“%d,%d,&a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机械工艺连接座课程设计
- 机械工程 测绘课程设计
- 新生入学学习方法指导方案
- 机械原理剪板机课程设计
- 六年级品德与社会下册 第三单元 同在一片蓝天下 1《战争风云下的苦难》教案1 新人教版
- 高中数学 第二章 函数 2.2.1 函数的单调性(1)教案 苏教版必修1
- 机械制造用钢课程设计
- 八年级信息技术下册 第一单元绘制矢量图 第六节 元件及其调用教案
- 2015年陕西省中考真题语文试题(解析版)
- 2024年秋八年级历史上册 第23课 内战爆发同步教案 新人教版
- 水稻栽培技术-水稻常规栽培技术
- 四风整改台账清单
- 标准报价单模板(二)
- 【期中】第1-4单元易错题专项攻略-数学四年级上册苏教版(含答案)
- 《mc入门教程》课件
- 物理化学实验B智慧树知到课后章节答案2023年下北京科技大学
- 福建省厦门市第一中学2023-2024学年七年级上学期期中数学试卷
- 医院病房超市经营管理服务方案
- 社会秩序的维护主要靠法律还是靠道德辩论赛
- 中国各区域矢量地图素材(详细到省市、能编辑)
- 苏教版四年级下册数学《解决问题的策略-画示意图》课件(区级公开课)
评论
0/150
提交评论