C语言程序设计(最权威版本)5

上传人:飞*** 文档编号:33919900 上传时间:2018-02-19 格式:PPT 页数:47 大小:1.25MB
返回 下载 相关 举报
C语言程序设计(最权威版本)5_第1页
第1页 / 共47页
C语言程序设计(最权威版本)5_第2页
第2页 / 共47页
C语言程序设计(最权威版本)5_第3页
第3页 / 共47页
C语言程序设计(最权威版本)5_第4页
第4页 / 共47页
C语言程序设计(最权威版本)5_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《C语言程序设计(最权威版本)5》由会员分享,可在线阅读,更多相关《C语言程序设计(最权威版本)5(47页珍藏版)》请在金锄头文库上搜索。

1、第五章 指针,教学目标,理解指针和地址的概念掌握指针定义与指针运算了解空指针和void指针了解常量指针和指针常量理解指针与数组的关系掌握指针与字符串掌握指向指针的指针,教学内容,内存与内存地址内存中变量的存储指针变量的定义与引用空指针和void指针指针运算常量指针和指针常量指针与数组指针与字符串指向指针的指针,内存(1),内存:内存是计算机中存储程序以及数据的地方。 位(bit)是计算机表示信息的最小单位。内存是由一系列连续的存储单元组成,其中的每一个存储单元我们称为“字节”。字节(byte)是最基本的存储单元单元。,内存(2),内存地址:(1)存储单元的“编号”就是该存储单元在内存中的地址,

2、它是从0开始的。(2)每个存储单元的编号都是唯一的。(3)存储单元的编号采用一个十六进制数。例如64kB内存的地址为0000HFFFFH,内存中变量的存储,变量的直接访问,通过变量名访问内存单元的方式称为“直接访问”。例如:int i=3,j=4,k=4;k=k*j的执行过程是:(1)取得变量k,j的地址2004H,2002H。(2)将地址2004H,2002H的值取出,然后相乘。(3)将相乘后的结果放到地址2004H开始的内存单元中。,变量的间接访问,引入指针变量,用来保存变量的地址。定义指针变量:类型 *指针变量名;获得变量地址: (单目运算符,指针变量示例1,Tc中,指针变量示例2,一个

3、指针变量在内存中占两个字节(small模式编译)tc 一个指针变量在内存中占四个字节(32位机器上) vcFloat i=3.1 p=4.2 k=5.3Float *fp=&i *fq=&f2,vc中,指针变量的定义与操作(1),(1)定义并初始化指针变量int i=3;int *p = ,指针变量的定义与操作(2),(3)将整数值赋值存放到指针变量指向的内存地址int i=3;int *p = *运算符与&运算符的优先级相同,且都是“右结合”。 *p=.中的*与指针变量定义中的*;是不同的。,指针赋值的注意事项,1、 指针变量不能与普通变量相互赋值。 int x,*px; px=x; /在V

4、C中会出现警告提示。2、指向同一种数据类型的指针变量之间可以相互赋值 而指向不同数据类型的指针变量之间不可以相互赋值。 int a,*p1,*p2; int a,*p1; float *p2; p1=,空指针,(1)什么是空指针?不指向任何实际的对象或者函数的指针为空指针。(2)将指针初始化为空指针,这不是说指针的存储单元为空,而是给指针赋予一个 ASCII码值为0的字符NULL。 例如:char *p=NULL;(3)将指针变量(p1,p2,p3,p4)进行如下操作,皆可以使得指针成为空指针:p1 = 0;p2 = 0L;p3 = 0; p4=(void*)0;,void指针,(1)指向vo

5、id的指针为void指针。(2)因为没有对象的类型是void,所以void指针又称为万能指针。(3) void指针示例: (指针类型的强制转换),int i=3;int *p1=,pvoid=p1;printf(int: pvoid=%dn,*(int*)pvoid);fp=,输出结果3;3.10000,代码阅读与分析 示例1,例1:阅读分析程序#include int main()int a=10,b;int *ipa;*ipa=a; /编译警告,运行出错!指针未初始化/ipa=,代码阅读与分析 示例2,例1:阅读分析程序 main() int *px,x,y; x=10; *px=x; y

6、=*px; x=20; y=*px; printf(“x=%d,y=%d”,x,y);该程序执行后输出:x=20, y=10,点评:(1)由于指针px没有赋初值,并不指向变量x,所以x改变后,y的值并没有改变。(2)如果把*px=x;改为*px=,则最后的y值为20,取地址运算(&)和取内容运算(*),取地址运算符(则 &(*px) : 表示指针px(取指针的目标 变量*px(即变量x)的地址) *(&x) : 表示变量x(取变量x的地址中所存储的内容),取地址与取内容运算示例,#include int main()int x=3,*px=,指针与整数的加减运算,指针变量加上或减去一个整数n,

7、是指针由当前所指向的位置向前或向后移动n个数据的位置。 如果p是一个指针,n是一个正整数,p+n操作后的实际地址是: p+n*sizeof(数据类型) (sizeof为系统函数) 例:假设指针的当前地址值为:p=2000,q=2400 main() int *p; float *q; printf(“%x,%xn”,p,q); printf(“%x,%xn”,p+=1, q+=1);,注意:VC中short为2字节,int为4字节。,指针自增(自减)运算,指针自增(自减)运算是地址运算。指针自增(自减)后指向下一个(上一个)数据。要注意指针自增(自减)运算的优先级。注意下面两个表达式的意义:

8、x=(*p)+; 将目标变量*p的值赋给变量x,然后变量*p自增1。 x=+(*p); 将目标变量*p的值自增1后赋给变量x。另外,注意*p+,*(p+)与*(+p)的用法区别,指针自增(自减)运算-示例,#include int main()int a = 1,2,3,4,5,6,7;int *p=a;printf(*(p+) = %dn,*(p+) );printf(*p = %dn,*p );printf(*(+p) = %dn,*(+p) );printf(*p = %dn,*p );printf(*p)+ = %dn,(*p)+ );printf(*p = %dn,*p );prin

9、tf(+(*p) = %dn,+(*p) );printf(*p = %dn,*p ); printf(p-a = %dn,p-a );printf(*(p+3) = %dn,*(p+3) );printf(*(p-2) = %dn,*(p-2) );return 0;,运行结果:12333455261,指针相减运算,(1)两个指向同种数据类型的指针可以相减。(2)指向同一数组的两个指针相减,其差为这两个指针所指向的数组元素之间所相差的元素个数。(3)指针相减不是两个指针值的单纯相减,而 与数据类型的存储长度有关。 运算结果为: 两指针地址值之差 / 一个数据项存储字节数,指针的关系运算,两个

10、指向同种数据类型的指针可以作关系运算,表示它们所指向的地址之间的关系。指针间允许4种关系运算: 比较两指针所指向地址的大、小关系 =、 != 判断两指针是否指向同一地址 若p指针指向的地址小于q指针指向的地址:pq 的结果为非0,否则为0。 注意:指针不能与一般数值进行关系运算,但可和0 进行=和!=的关系运算。 p=0;p!=0; 用于 判断指针p是否为空指针。,常量指针和指针常量,常量指针: const Type *pointer ;例如: const float pi=3.14f; float f1=2.3f; const float *pb1= 是不允许的这样保证了用户不会通过*指针这

11、种方式来修改该内存区的内容。,常量指针和指针常量,指针常量: Type * const pointer ;例如:int a1=3,b1=5; int *const pa=(3)指针常量声明时必须初始化。,指针变量和一维数组,一、一维数组与指针1、一维数组和数组元素的地址 在C语言中,数组名代表该数组的首地址,即数组中第一个元素的地址,也称为该数组的指针。每一个数组元素也有一个地址,称为该元素的指针。 例如有以下说明语句:int a10,*p; 则语句p=a;和p=和p=&a1;两个语句也是等价的。它们的作用是把数组a中第二个元素a1的地址赋给指针变量p。 如果指针变量p=a,以此类推,下面三个

12、表达式等价 p+i a+i &ai他们均表示第i个元素的地址,指针和一维数组,2、通过指针引用数组元素(1)通过数组名引用数组元素 假设有如下说明语句: int a10, *p; 则: p=a;把a0的地址值赋给指针变量p, 即:p指向a0 而: p+i 代表了a数组第i个元素的地址, *(p+i) 代表了第i个元素ai。例:通过数组名输入一维数组main()int a10,i;for(i=0;i10;i+)scanf(“%d”,a+i);,请注意:以前这里采用&ai表示数组元素ai的地址,而现在可以用a+i表示数组元素ai的地址,指针和一维数组,(2) 通过带下标的指针引用数组元素假设有如下

13、说明语句: int a10, *p; 在p=a的条件下,则*(p+i)可以写成 pi。 在p=a的条件下,对ai数组元素的引用方式还可 以是:*(a+i),*(p+i),pi。注意: a和a0具有不同含意。前者是一个地址常量,是存储单元a0的地址;而后者是一个变量名,代表一个存放数据的存储单元。 P与a的区别: p是地址变量,它可以指向任何地址变量,因此,可以对其进行加、减和赋值运算。 p+,p=a,p=是非法的,指针和一维数组示例1,#include int main()int a10=9,8,7,6,5,4,3,2,1,0,*p;int i;/数组名a是一个指针常量,指向a0的地址,不允许

14、a+;a+=1;/ai是一个变量名,代表数组a的第i个存储单元p=a;printf(*(a+5)= %dn,*(a+5);printf(a5= %dn,a5);printf(*(p+5)= %dn,*(p+5);printf(p5= %dn,p5); return 0;,指针和一维数组示例1,#include int main()int a10=9,8,7,6,5,4,3,2,1,0,*p; /数组名a是一个指针常量int i;p=a;for(i=0; isizeof(a)/sizeof(int); i+) /允许p+;p+=1; printf(a%d= %dn,i,*p+);p=a;for(i=0; isizeof(a)/sizeof(int); i+)printf(a%d= %dn,i,*p);p+=1;for(i=0; isizeof(a)/sizeof(int); i+) /不允许a+;a+=1; /printf(a%d= %dn,i,*a+); /a+=1; printf(a%d= %dn,i,*(a+i);return 0;,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号