




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编辑课件第第8章章 地址和指针地址和指针v8.1 变量的地址和指针变量的地址和指针v8.2 指针变量的定义和指针变量的基类型指针变量的定义和指针变量的基类型v8.3 给指针变量赋值给指针变量赋值v8.4 对指针变量的操作对指针变量的操作v8.5 函数之间地址值的传递函数之间地址值的传递考试的重点考试的重点编辑课件8.1 变量的地址和指针变量的地址和指针计算机的内存是以计算机的内存是以字节字节为单位的一片连续的存储空间,每一个字节都有一个为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就成为编号,这个编号就成为内存地址内存地址。内存空间内存空间 地址地址101010111012101
2、3101410151016:120012011202120312041205例如:例如:short a,b; float x; a=3;b=5;x=3.5;:2002200320042005abx353.5每个变量的地址是指该变量所占每个变量的地址是指该变量所占存储单元的第一个字节的地址。存储单元的第一个字节的地址。在在C语言中,我们可以定义整型变量、实型变量、字符变量。语言中,我们可以定义整型变量、实型变量、字符变量。他们都是用来存放数据的。他们都是用来存放数据的。今天,我们来学习一下特殊的变量,这种变量只是用来存放今天,我们来学习一下特殊的变量,这种变量只是用来存放内存地址的。内存地址的。
3、比如我们定义了一个指针变量比如我们定义了一个指针变量p占占4个字节个字节该变量中只能存放内存地址,比如把变量该变量中只能存放内存地址,比如把变量a的地址赋予指针的地址赋予指针变量变量p,则指针变量则指针变量p的值为的值为1012。1012请问请问当访问变量当访问变量a时,访问的是什么?时,访问的是什么?当访问指针变量当访问指针变量p时,访问的是什么?时,访问的是什么?31012当访问变量时,为当访问变量时,为“直接存取直接存取(直接访问直接访问)”。我们也可以通过指针变量间接的访问该地址中原来的值。此时我们也可以通过指针变量间接的访问该地址中原来的值。此时称为称为“间接存取间接存取(间接访问间
4、接访问)”。编辑课件8.2 指针变量的定义和指针变量的基类型指针变量的定义和指针变量的基类型定义指针变量的一般形式如下:定义指针变量的一般形式如下:类型名类型名 *指针变量名;指针变量名;或或类型名类型名 *指针变量名指针变量名1, *指针变量名指针变量名2,;例如:例如:int *pi; int *pj,*pa;1. pi,pj,pa都是变量,不过都是都是变量,不过都是指针变量指针变量,定义时在普通变量名的左边加上,定义时在普通变量名的左边加上星号星号就行了。就行了。说明:说明:pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放三个指针变量的类型为整型,说明三个变量中只能存放i
5、nt类型变量的地址。类型变量的地址。 这时我们称这时我们称int是指针变量是指针变量pi,pj,pa的的基类型基类型。如:如:double *pd; char *s1,*s2;pd的基类型为的基类型为double类型,在指针变量类型,在指针变量pd中,只能存放中,只能存放double类型变量的地址。类型变量的地址。s1和和s2的基类型为的基类型为char类型,在指针变量类型,在指针变量s1和和s2中,只能存放中,只能存放char类型变量的地址。类型变量的地址。编辑课件8.3 给指针变量赋值给指针变量赋值8.3.1 给指针变量赋地址值给指针变量赋地址值例如:例如:int k,*q,*p; /*k
6、为整型变量,为整型变量,q和和p都是指针变量。都是指针变量。*/qpkk=1;/*给普通变量赋值给普通变量赋值*/整型变量整型变量k只被能赋予整型值,赋值时直接赋值就可以只被能赋予整型值,赋值时直接赋值就可以了,而指针变量只能被赋予地址值,如下是把整型变了,而指针变量只能被赋予地址值,如下是把整型变量量k的地址赋值给指针变量的地址赋值给指针变量q。q=&k;&是用来求出变量的地址。是用来求出变量的地址。知识点:知识点:由于把变量由于把变量k的地址赋予了指针变量的地址赋予了指针变量q,q中现在存放的就是变量中现在存放的就是变量k的地址,的地址,这时可以说:这时可以说:q指向了变量
7、指向了变量k。指针变量之间也可以进行赋值:指针变量之间也可以进行赋值:p=q;当我们输出变量当我们输出变量k,q,p时,输出的结果为;时,输出的结果为;112450521245052编辑课件8.3 给指针变量赋值给指针变量赋值8.3.2 给指针变量赋给指针变量赋“空空”值值除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为“空空”值。值。int *p;p=NULL; int *p;p=0; int *p;p=0; 注意注意此时,指针变量此时,指针变量p中不是没有值,而是有一个中不是没有值,而是有一个“空空”值。值
8、。编辑课件8.4 对指针变量的操作对指针变量的操作8.4.1 通过指针来引用一个存储单元通过指针来引用一个存储单元#include main()int k,*q,*p; k=1; q=&k; p=q; printf(“%dn%dn%dn,k,q,p);112450521245052输出时,变量输出时,变量k为为1,而指针变量,而指针变量q和和p则为变量则为变量k的地址。的地址。#include main()int k,*q,*p; k=1; q=&k; p=q; printf(“%dn%dn%dn,k,*q,*p);1k&kq&kp111访问时,在指针变量前在访
9、问时,在指针变量前在*(间接访问运算符间接访问运算符)则则表示访问该地址中原来的值。表示访问该地址中原来的值。编辑课件8.4 对指针变量的操作对指针变量的操作8.4.1 通过指针来引用一个存储单元通过指针来引用一个存储单元假定有以下定义和语句:假定有以下定义和语句:int *p,i=10,j;p=&i;j=*p;/*定义了三个变量定义了三个变量*/*取变量取变量i的地址赋给指针变量的地址赋给指针变量p*/*间接访问指针变量中的值间接访问指针变量中的值10赋给变量赋给变量j*/p10ijj=i;间接访问运算符间接访问运算符*是一个单目运算符,必须出现在运算对象的左边。其运算对象是一个单目
10、运算符,必须出现在运算对象的左边。其运算对象可以是存放地址的指针变量,也可以是地址。可以是存放地址的指针变量,也可以是地址。j=*(&i);j=*&i;扩展知识:扩展知识:j=*p+1;10j11jint *p,k=0;p=&k;pk*p=100;0k=100;*p=*p+1;k=k+1;*p+=1; 或或 +*p; 或或 (*p)+;若有以下定义和语句:若有以下定义和语句:int *p,*s,k=20;s=&k;p=&s; ps20k编辑课件8.4 对指针变量的操作对指针变量的操作8.4.1 通过指针来引用一个存储单元通过指针来引用一个存储单元程序举例
11、:程序举例:例例8.1 用指针指向两个变量,通过指针运算选出值最小的那个数。用指针指向两个变量,通过指针运算选出值最小的那个数。#include main()int a,b,min,*pa,*pb,*pmin; pa=&a;pb=&b;pmin=&min; scanf(“%d%d”,pa,pb); printf(“a=%d b=%dn”,a,b); *pmin=*pa; if(*pa*pb) *pmin=*pb; printf(“min=%dn”,min);papbpmina b min/*输入的值依次放入输入的值依次放入pa、pb所指存储单元中所指存储单元中*/sca
12、nf(“%d%d”,&a,&b);比如输入:比如输入:41 32a=41 b=32 min=a;41if(ab) min=b;32min=32 编辑课件8.4 对指针变量的操作对指针变量的操作8.4.2 移动指针移动指针 & 8.4.3 指针比较指针比较所谓所谓移动指针移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。指向相邻的存储单元。假定在内存中开辟了如图所示的五个连续的、存放假定在内存中开辟了如图所示的五个连续的、存放int类型整数的存储单元,并分别给类型整数的存储单
13、元,并分别给它们取代号为:它们取代号为:a0、 a1、 a2、 a3、 a4。这些代号所代表的存储单元中,分别有值为:这些代号所代表的存储单元中,分别有值为:11、22、33、44、55。a0 a1 a2 a3 a411 22 33 44 55例如:例如:int *p,*q; p=&a0;pq=p+2;q+;q+;q-;p+;qqqp当有:当有:int i,j,k; i=*p;j=*q;k=q-p;ijk22 44 2指针比较指针比较if(pq) printf(“p points to lower memory than q.n”);else printf(“q points to l
14、ower memory than p.n”);p points to lower memory than q.if(p=0) printf(“p points to NULL.N”);编辑课件8.5 函数之间地址值的传递函数之间地址值的传递8.5.1 形参为指针变量时实参和形参之间的数据传递形参为指针变量时实参和形参之间的数据传递例例8.2 程序举例。程序举例。#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”,&a
15、mp;x,&y); z=myadd(&x,&y); printf(“%d+%d=%dn”,x,y,z);xyzEnter x,y: 24 41调用调用传递传递absumsum=x+y;退出函数,将变量退出函数,将变量sum的值作的值作为这个函数的返回值,返回到为这个函数的返回值,返回到他的调用处。此时,该函数中他的调用处。此时,该函数中的变量全部释放。的变量全部释放。6524+41=65 编辑课件8.5 函数之间地址值的传递函数之间地址值的传递8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值通过传递地址值在被调用函数中直接改变调用函数中的变量的值例例
16、8.3 调用调用swap函数,交换主函数中变量函数,交换主函数中变量x和和y中的数据。中的数据。第七章例第七章例7.3的重写的重写#include void swap(int *,int *);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);/*函数说明语
17、句函数说明语句*/xy(1)x=30 y=20调用调用传递传递abt(2)a=30 b=20(3)a=20 b=30退出该函数,返回到它的调用处,退出该函数,返回到它的调用处,该函数无返回值,因为该函数为该函数无返回值,因为该函数为void类型,此时该函数中的变量全类型,此时该函数中的变量全部释放。部释放。(4)x=20 y=30t =x;x=y;y=t;30202030编辑课件8.5 函数之间地址值的传递函数之间地址值的传递8.5.2 通过传递地址值在被调用函数中直接改变调用函数中的变量的值通过传递地址值在被调用函数中直接改变调用函数中的变量的值例例8.4 编写函数编写函数order(int
18、 *a,int *b),使调用函数中的第一个实参总是存放两个数中,使调用函数中的第一个实参总是存放两个数中的较小的数,第二参数存放两个数中较大的数。的较小的数,第二参数存放两个数中较大的数。#include void swap(int *x1,int *x2)int t; t=*x1;*x1=*x2;*x2=t;void order(int *a,int*b)if(*a*b) swap(a,b);main()int x,y; printf(Enter x,y:); scanf(%d%d,&x,&y); printf(x=%d y=%dn,x,y); order(&x,&
19、amp;y); printf(x=%d y=%dn,x,y);xyEnter x,y: 41 24x=41 y=24 调用调用ab传递传递if(xy) swap(a,b);调用并传递数据调用并传递数据x1x2t=x;x=y;y=t;2441x=24 y=41 编辑课件8.5 函数之间地址值的传递函数之间地址值的传递8.5.3 函数返回地址值函数返回地址值#include int *fun(int *,int *);main()int *p,i,j; printf(Enter two number:); scanf(%d%d,&i,&j); p=fun(&i,&j
20、); printf(i=%d,j=%d,*p=%dn,i,j,*p);int *fun(int *a,int *b)if(*a*b) return a; return b;/*函数说明函数说明*/例例8.5 程序举例。程序举例。pijEnter two number:99 101传递传递abif(ij) return a;退出该函数,返回到它的调用处,退出该函数,返回到它的调用处,该函数的返回值是一个该函数的返回值是一个地址地址(j的地的地址址),所以该函数是一个指针类型。,所以该函数是一个指针类型。退出时该函数中的变量全部释放。退出时该函数中的变量全部释放。i=99,j=101,*p=101
21、 编辑课件习题一.选择题8.1 若有定义:int x,*pb;则正确的赋值表达式是A pb=&x B pb=x C *pb=&x D *pb=*x8.2 若有以下程序:#include main()printf(“%dn”,NULL);程序的输出结果是A 因变量无定义输出不定值 B 0 C -1 D 18.3 若有以下程序:#include void sub(int x,int y,int *z) *z=y-x; main()int a,b,c; sub(10,5,&a); sub(7,a,&b); sub(a,b,&c); printf(%d,%d,%
22、dn,a,b,c);程序的输出结果是A 5,2,3 B -5,-12,-7 C -5,-12,-17 D 5,-2,-7ABB编辑课件习题8.4 若有以下程序:#include main()int k=2,m=4,n=6,*pk=&k,*pm=&m,*p; *(p=&n)=*pk*(*pm); printf(%dn,n);程序的输出结果是A 4 B 6 C 8 D 108.5 若指针p已正确定义并指向如图所示存储单元:则执行语句*p+; 后,*p的值是A 20 B 30 C 21 D 318.6 若指针p已正确定义并指向如图所示存储单元,则*+p的值是A 20 B 30
23、 C 21 D 318.7 若指针p已正确定义并指向如图所示存储单元,则+*p的值是A 20 B 30 C 21 D 31a0 a1 a2 a3 a410 20 30 40 50pCBBC编辑课件习题8.8 若有以下程序:#include void prtv(int *x) printf(%dn,+*x); main()int a=25; prtv(&a);程序的输出结果是A 23 B 24 C 25 D 268.9 若有以下程序#include main()int *k,*a,b=100; a=&b;k=&a;printf(%dn,*k);程序的输出结果是A 运行错误
24、 B 100 C a的地址 D b的地址DB编辑课件习题8.10 若有以下程序:#include void fun(float *a,float *b)float w; *a=*a+*a; w=*a; *a=*b; *b=w;main()float x=2.0,y=3.0,*px=&x,*py=&y; fun(px,py); printf(%2.0f,%2.0fn,x,y);程序的输出结果是A 4,3 B 2,3 C 3,4 D 3,28.11 若有以下程序:#include void sub(double x,double *y,double *z) *y=*y-1.0; *z=*z+x; main()double a=2.5,b=9.0,*pa,*pb; pa=&a; pb=&b; sub(b-a,pa,pa); printf(%fn,a);程序的输出结果是A 9.000000 B 1.500
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智慧物流示范园区资金申请项目环境评价与可持续发展报告
- 深度解读:2025年工业互联网平台RFID技术在智慧工厂生产设备安全监控中的应用前景
- 患者跌倒风险评估管理制度
- 肿瘤医院放射防护用品肿瘤工作人员配备制度
- 旅游度假区股权转让与资源开发合同
- 股权转让与体育产业项目开发及运营合同
- 跨境电商进口车辆贷款协议范本
- 股票期权激励与员工期权执行收益协议
- 二手车位购买与转让合同样本:车位产权交易
- 地产开发项目股权调整与增资扩股合作协议
- 2024年大学试题(法学)-行政法与行政诉讼法考试近5年真题集锦(频考类试题)带答案
- 有限空间辨识记录(辨识结果不是有限空间的)
- 医院整体搬迁服务 投标方案(技术方案)
- 鱼塘个人承包协议书范本
- GB/T 4706.8-2024家用和类似用途电器的安全第8部分:电热毯、电热垫、电热衣及类似柔性发热器具的特殊要求
- 正压式空气呼吸器使用培训课件
- 08S305 小型潜水排污泵选用及安装
- 初中自荐信范文
- 血培养采集课件
- 广东省茂名市直属学校2023-2024学年七年级下学期期末数学试题
- 小学语文部编版六年级下册全册阅读知识点(分单元课时编排)
评论
0/150
提交评论