《第六章第一讲指针变量及指针运算符.ppt》由会员分享,可在线阅读,更多相关《第六章第一讲指针变量及指针运算符.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章 指针 第一节 指针与指针变量1.指针的基本概念 计算机内存是有一片连续的存储单元组成,操作系统给每个单元一个编号,这个编号称为内存单元的地址,每个存储单元占内存一个字节。定义变量时,系统就按照其类型为变量分配一块连续的存储单元。则这块存储单元的首地址称为该变量的指针(也称该变量的地址)。如:float f;假设分配给f的是地址为1500、1501、1502、1503的四个连续字节。则称地址1500是变量f的指针(或说变量f的地址是1500)。所以,变量的地址就是变量的指针。第六章 指针 第一节 指针与指针变量n先来看 卡片管理系统 假设有许多存储不同数据的卡片,如图。想对这些数据快速存
2、取,一个好方法就是对每张卡片编号,再为每张卡片取个名字,让名字和编号一一对应起来。这样就能通过名字存取卡片上的数据,比如指出卡片名f,就可以由对应地址1500处取出数据456.789。123您好!456.7891500卡片上数据卡片编号 1500015002卡片名字 abchipf.注意:p 是一种特殊的卡片,它存储的是卡片 f的编号,则通过p 也能间接地存取卡片f的数据。图5.1第六章 指针 第一节 指针与指针变量n变量值的存取与卡片数据存取相类似。每个变量都有名字和地址。同样是使用变量名通过相应地址存取数据。可以把图5.1理解成变量存储的情况,如图5.2。假设变量f为float型。则读取f
3、的值是从地址1500开始的四个字节中取出数据456.789。这种称为“直接存取”方式。特殊变量p存储了变量f的地址。则可以通过访问p变量,可以得到地址1500,再访问1500的存储单元,也可以得到f的值456.789。这种称为“间接存取“方式。变量的值地址编号 1000500015001002变量名 abchipf.123您好!456.7891500 图5.2第六章 指针 第一节 指针与指针变量 象p变量这种,专门存放其他变量的地址的变量,称为指针变量。如图5.2,指针变量p里已经存储了f 变量的地址,我们又说指针变量p指向了变量 f。2.指针变量的定义 定义的一般形式:类型名类型名 *标识符
4、标识符;如:int i,*ip,*jp;/*定义了ip和jp两个可以指向整型变量的指针变量*/float f,*p;/*定义了一个可以指向float型变量的指针变量p*/注意:a.定义了一个指针变量,在没有对它赋值前,它指向的存储单元是不确定的。b.一个指针变量只能指向其类型相同的变量第六章 指针 第一节 指针与指针变量3.指针变量的赋值 1).通过地址运算符&赋值 “&”是单目运算符,作用是对其右边的对象进行取地址。如:float f,*p;p=&f;/*这样指针变量p就指向变量f了*/2).指针变量初始化。如:float f,*p=&f;变量p 指向 ff3d 变量fff3df的值第六章
5、指针 第一节 指针与指针变量3)通过其他指针变量赋值 可以把一个指针变量的地址值赋给另一个指针变量,这样两个指针变量均指向同一个地址。如:int i,*p1=&i,*p2;p2=p1;指向 2f3a 变量p1 变量i 变量p2 注意,当把一个指针变量的地址值赋给另一个指针变量时,赋值号两边指针变量所指的数据类型必须相同。2f3ai的值2f3a第六章 指针 第一节 指针与指针变量如:int i,*pi=&i;float*pf;pf=pi;/*这句是非法的*/4).用NULL给指针变量赋空值 可以给指针变量赋空值,如:p=NULL;NULL是在 Stdio.h头文件中定义的预定义标识符,因此在使用
6、 NULL时,应该在程序中加上文件包含#include“stdio.h”。在C语言中当指针值为NULL时,指针不指向任何有效数据。由于NULL与整数0相对应,所以下面三条语句等价:p=NULL;或 p=0;或 p=0;NULL可以赋值给指向任何类型的指针变量。第六章 指针 第一节 指针与指针变量6.1.2 指针运算符 指针运算符 “*”和 取地址运算符“&”指针运算符“*”的运算对象必须放在指针运算符的右侧,是用来存取相应的存储单元中的数据。运算符和*都是单目运算符,它们具有相同的优先级,结合方向均为“从右到左”.例如:int i123,j,*p;p=i;则 j=*p;和j=*&i;都将把变量
7、 i的值赋给变量 j。而*p=456;和*i=456;都将把整数456赋给变量 i。第六章 指针 第一节 指针与指针变量 所以:1.*&i 等价于变量i.2当一个指针变量 p指向某变量 i时(p=i;),则表达式*p与变量 i等价。例如:p=i;printf(”dn”,*p)/*相当于 printf(”dn”,i);*/j=(*p)+;/*相当于j=i十十;*/注意表达式(*p)+中的括号不能省略,如果没有括号,则*p+等价于*(p+),此时先使用变量i的值,再使p的值改变,这样p就不再指向变量i了。第六章 指针 第一节 指针与指针变量 指针变量的值是可以改变的.通过*p方式存取它所指向变量的
8、值是以间接存取的形式进行的.如:int i=1,j=2,*p;p=i;*p=100;/*相当于i+=100;*/p=j;(*p)-;/*相当于j-;*/另外,注意:若有 int i,*p=&i;/*相当于 int I,*p;p=i;*/则 1.*p 等价于 i 等价于 *&i 2.*p 等价于 p 3*i是非法的表达式,因为i不是地址,也不是指针变量。而指针运算符“*”的运算对象必须是指针变量或地址。第六章 指针 第一节 指针与指针变量例 6.1由键盘输入一个正整数,求出其最高位数字。用指针变量来完成本题。main()long i,*p;p=i;printf(请输人一个正整数:”);scanf
9、(“%ld”,p);/*本语句等价于scanf(“ld”,i);*/while(*p=10)*P/=10;/*求出该正整数的最高位数字*/printf(最高位数字是:%ld./n”,*p);运行结果:请输人一个正整数:56789 最高位数字是:5。语句P=&i;是不可少的,若指针变量P在使用之前未赋初值,它可能指向内存中任意一个地址,可能导致程序出现意想不到的错误。第六章 指针 第二节 数组与指针6.2.1 指针与一维数组1一维数组和数组元素的地址 一个数组的元素在内存中是连续存放的,数组第一个元素的地址称数组第一个元素的地址称数组的首地址数组的首地址。在C语言中,数组名是该数组的首地址数组名
10、是该数组的首地址。例如有以下定义语句:int a10,*p;则语句p=a;和p=ao;是等价的(即a等价于&ao),都表示指针变量p指向a数组的首地址。数组首地址的值是一个地址常量,是不能改变的。因此,语句 a=p;或 a+;都是非法的.第六章 指针 第二节 数组与指针在C语言中,若定义 int a6;则:数组的0元素a0的地址是a (等价于&a0);数组的1元素 a1的地址是 a+1(等价于&a1);数组的2元素a2的地址是a+2(等价于&a2);数组的i元素a i 的地址是a+i(等价于&ai);例如,有下述程序段:例如,有下述程序段:int a6=1,2,3,4,5,6,*p=a;/*p
11、指向整型数组指向整型数组 a的首地址的首地址*/double d6=1.1,2.2,3.3,4.4,5.5,6.6,*q=d;假设数组假设数组a的首地址是的首地址是2000,假设数组,假设数组d的首地址是的首地址是3000.第六章 指针 第二节 数组与指针 则上述两个数组分配的内存情况如图 54所示,应注意整型数组(int)每下移一个元素地址加2字节,双精度实型数组(double)每下移一个元素地址加 8字节。图5.4 a第六章 指针 第二节 数组与指针 数组数组d 的内存情况的内存情况:图图5.4 b 此时的此时的 q+1 等价于等价于 d+1,也等价于也等价于&d1 q+i 等价于等价于
12、d+i,也等价于也等价于&di第六章 指针 第二节 数组与指针2通过一维数组名所代表的地址存取数组元素通过一维数组名所代表的地址存取数组元素 根据指针运算符根据指针运算符“*”的运算的运算 规则知规则知*(a+i)与元素与元素ai等价等价 例如,下述程序段:例如,下述程序段:int a =1,2,3,4,5,6,7,8,9,10 ;*(a+5)=50;/*相当于相当于a5=50;*/scanf(“%d”,&a8);/*相当于相当于scanf(“%d”,a+8);*/printf(“dn”,*(a5);/*相当于相当于 printf(“dn”,a5);*/第六章 指针 第二节 数组与指针3通过指
13、针运算符通过指针运算符“*”存取数组元素存取数组元素 设有如下程序段:设有如下程序段:int a10,*p;p=a;则则 *(p+i)与元素与元素a i 等价等价 以下程序段合法以下程序段合法:int a 1,2,3,4,5,6,7,8,9,10,*pa;*(p+5)=50;/*相当于相当于a5=50;*/scanf(”d”,a8);/*相当于相当于 scanf(“%d”,p+8);*/printf(”d n”,*(p5);/*相当于相当于 printf(“%dn”,a5);*/第六章 指针 第二节 数组与指针4通过带下标的指针变量存取数组元素 C语言中的下标运算符“”可以构成表达式,假设p为
14、指针变量且指向数组首元素,i为整型表达式,则可以把pi看成是表达式,首先按p+i计算地址,然后再存取此地址单元中的值。因此pi与*(p+i)等价。例如,下述程序段:int a=1,2,3,4,5,6,7,8,9,10,*p=a;p5=50;/*相当于 a 5=50;*/scanf(”d”,&a8);/*相当于scanf(”%d”,p8);*/printf(”dn”,p5);/*相当于printf(”%dn”,a5);*/第六章 指针 第二节 数组与指针 综上所述,若定义了一维数组a和指针变量p,且p=a;则有如下等价规则:以上假设p所指的数据类型与数组a元素的数据类型一致,i为整型表达式。此处,两个表达式“相互等价”仅仅是指“存取变量值”时两个表达式是等价的。