您好,欢迎访问三七文档
C程序设计快速进阶大学教程2020/9/202第11章指针本章要点指针概念指针与数组指针与函数字符串动态空间管理C程序设计快速进阶大学教程2020/9/20311指针知识点指针概念指向数组的指针、指针数组指针做参数、指针做为函数值、指向函数的指针字符串动态空间管理C程序设计快速进阶大学教程2020/9/20411.1理解指针当问路时,经常听到这样的回答:“向前走过3个路口右转,再过两个路口左转,再前行200米。”当在图书馆中找一本时,经常是这样找:“第五排书架,从上向下数第二层,左数第6本。”老师提问学生,在不知道学生姓名的情况下,经常说:“第4排左数第二个同学。”上述例子说明对一个事务的访问,当不能够通过名称直接访问,只能够通过其位置进行访问。C程序同样的道理,前面的章节对数据的访问是通过变量名称实现的,但是,有时候不知道其名称,甚至其没有名称,这时候只能通过该数据所在的地址进行访问。C程序设计快速进阶大学教程2020/9/20511.2指向变量的指针C语言中定义一个变量时,例如:inti1=3;描述了变量相关的3方面的属性:值、地址、类型。3占用4字节起始地址为0012FF781.值为3,通过变量访问,如i1+52.地址为0012ff78(32位机器,0012ff78为16进制数),占用内存空间的位置,通过&i1访问,&在scanf语句中使用过。3.类型为int,决定了其能够参加的运算,同时也决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小通过sizeof运算符,在vc中sizeof(i1)为4个字节。C程序设计快速进阶大学教程2020/9/20611.2指向变量的指针把变量i1的地址存放于指针变量pi1中3占用4字节起始地址为0012FF780012FF78(变量i1)(指针变量pi1)起始地址为0012FF74占用4字节C程序设计快速进阶大学教程2020/9/20711.2.1指针变量的定义指针变量定义的一般形式为:类型说明符*变量名;例如:int*pi1;对指针变量的定义包括三个内容:1.指针类型说明,*表示这是一个指针变量;2.指针变量名,pi1为指针变量名;3.指针所指向的变量的数据类型,int为指针变量所指向的变量的数据类型,说明pi1只能储存整型变量的地址。再如:float*pf1;/*pf1是指向浮点变量的指针变量*/char*pc1/*pc1是指向字符变量的指针变量*/C程序设计快速进阶大学教程2020/9/20811.2.2指针变量的引用指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。(问路时别人告诉你一个不存在的地址,会怎么样?)C程序设计快速进阶大学教程2020/9/20911.2.2指针变量的引用和指针相关有两个运算符&和*:1.&:取地址运算符。其一般形式为:&变量名取一个内存变量的地址。2.*:指针运算符(或称“间接访问”运算符)。其一般形式为:*指针变量名通过指针变量间接访问指针变量所指向变量的数据。inti1;int*pi1;pi1=&i1;inti2=*pi1+1;此处*代表间接访问运算符,取指针变量pi1所指向的变量i1的值(对i1间接访问)加1赋值给变量i2。此语句结果完全等价于:inti2=i1+1;C程序设计快速进阶大学教程2020/9/201011.2.2指针变量的引用指针变量说明:1.对*要区别类型说明符与间接访访问符。2.不能用一个数给指针变量赋值,下面赋值是错误的:int*pi1;pi1=20;但是,指针可用0赋值,代表空指针,哪里也不指向。3.给指针变量赋值时,指针变量前不能加“*”说明符,下面的写法是错误的:inti1;int*pi1;*pi1=&i1;指针变量pi1前面加*就代表间接访问了,代表i1。C程序设计快速进阶大学教程2020/9/201111.2.2指针变量的引用指针变量说明:4.指针变量未指向具体有效地址,间接访问会有问题int*pi1;/*指针变量pi1未赋值,不知道指向哪里*/*pi1=200;/*向pi1所指向的地址空间赋值200*/(随机给你一个账户,存钱后怎样取呢?)判定一个指针变量是否指向有效空间:int*pi1=0;……if(pi1!=0)*pi1=200;省略号部分,若未使pi1指向有效空间,这对*pil的赋值就不会执行。C程序设计快速进阶大学教程2020/9/201211.2.2指针变量的引用指针变量说明:5.指针变量的值是可以改变的inti1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;3占用4字节起始地址为0012FF780012FF78(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节7占用4字节起始地址为0012FF74(变量i2)C程序设计快速进阶大学教程2020/9/201311.2.2指针变量的引用指针变量说明:5.指针变量的值是可以改变的pi1=&i2;改变指针变量pi1指向i23占用4字节起始地址为0012FF780012FF74(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节7占用4字节起始地址为0012FF74(变量i2)C程序设计快速进阶大学教程2020/9/201411.2.2指针变量的引用指针变量说明:6.指针变量只能用同类型的地址赋值float*pf1;/*pf1是指向浮点变量的指针变量*/charc1;/*字符变量*/pf1=&c1;pf1只能存储float数据的地址,用字符型数据地址赋值是错误的。C程序设计快速进阶大学教程2020/9/201511.2.2指针变量的引用指针变量说明:7.同类型指针变量间可以相互赋值例11.1交换指针变量#includestdio.hintmain(){inti1=3,i2=4;int*pi1,*pi2,*pi3;pi1=&i1;pi2=&i2;pi3=0;/*交换指针变量*/pi3=pi1;pi1=pi2;pi2=pi3;printf(i1=%d\ni2=%d\n,i1,i2);printf(*pi1=%d\n*pi2=%d\n,*pi1,*pi2);return0;}程序运行结果:i1=3i2=4*pi1=4*pi2=3C程序设计快速进阶大学教程2020/9/201611.2.2指针变量的引用指针变量说明:7.同类型指针变量间可以相互赋值例11.1交换指针变量3占用4字节起始地址为0012FF780012FF78(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节4占用4字节起始地址为0012FF74(变量i2)0012FF74(指针变量pi2)起始地址为0012FF6C占用4字节00000000(指针变量pi3)起始地址为0012FF68占用4字节指针变量交换前3占用4字节起始地址为0012FF780012FF74(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节4占用4字节起始地址为0012FF74(变量i2)0012FF78(指针变量pi2)起始地址为0012FF6C占用4字节00000000(指针变量pi3)起始地址为0012FF68占用4字节指针变量交换后C程序设计快速进阶大学教程2020/9/201711.2.2指针变量的引用指针变量说明:7.同类型指针变量间可以相互赋值例11.2交换指针变量所指向的数据#includestdio.hintmain(){inti1=3,i2=4;int*pi1,*pi2;intiTemp=0;pi1=&i1;pi2=&i2;/*交换指针变量所指向的数据*/iTemp=*pi1;*pi1=*pi2;*pi2=iTemp;printf(i1=%d\ni2=%d\n,i1,i2);printf(*pi1=%d\n*pi2=%d\n,*pi1,*pi2);return0;}程序运行结果:i1=4i2=3*pi1=4*pi2=3C程序设计快速进阶大学教程2020/9/201811.2.2指针变量的引用指针变量说明:7.同类型指针变量间可以相互赋值例11.2交换指针变量所指向的数据3占用4字节起始地址为0012FF780012FF78(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节4占用4字节起始地址为0012FF74(变量i2)0012FF74(指针变量pi2)起始地址为0012FF6C占用4字节0(变量temp)起始地址为0012FF68占用4字节指针变量指向数据交换前4占用4字节起始地址为0012FF780012FF78(变量i1)(指针变量pi1)起始地址为0012FF70占用4字节3占用4字节起始地址为0012FF74(变量i2)0012FF74(指针变量pi2)起始地址为0012FF6C占用4字节指针变量指向数据交换后3(变量temp)起始地址为0012FF68占用4字节C程序设计快速进阶大学教程2020/9/2019课堂练习1.指针变量存储的是什么?C程序设计快速进阶大学教程2020/9/202011.3数组与指针一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。对数组元素也可以采用指针进行访问,效率相对更高。C程序设计快速进阶大学教程2020/9/202111.3.1一维数组与指针一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址(常量)。intiArr[5]={1,2,3,4,5};int*pi;pi=&iArr[0];指针变量pi5数组iArr0012FF781234iArr[0],地址为0012FF78iArr[1],地址为0012FF7CiArr[4],地址为0012FF88iArr[3],地址为0012FF84iArr[2],地址为0012FF80存储的是&iArr[0],即iArr[0]的地址0012FF78C程序设计快速进阶大学教程2020/9/202211.3.1一维数组与指针C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此,下面两个语句等价:pi=&iArr[0];pi=iArr;iArr数组名是整型常量地址inti;iArr=&i;/*不可以,因为iArr为常量*/C程序设计快速进阶大学教程2020/9/202311.3.1一维数组与指针1.指针相关的运算符(1)取地址运算符&:单目运算符(注意其优先级),其结合性为自右至左,其功能是取变量的地址。(2)间接访问运算符*:单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。(3)赋值运算符=:可以给指针变量赋值。(4)算术运算符+、-、++、--。+:地址表达式(pi)+整型表达式(in),结果为在pi地址值位置跳过in×(pi所指类型字节数)个字节后的地址。C程序设计快速进阶大学教程2020/9/202411.3.1一维数组与指针1.指针相关的运算符-:地址表达式(pi)-整型表达式(in),结果为在pi地址值位置跳回in×(pi所指类型字节数)个字节后的地址。-:地址表达式(pi1)-地址表达式(pi12),结果为在pi2和pi1相差的字节数÷(pi1所指类型字节数)。pi1与pi2必须指向相同数据类型。++:地址变量(pi)++或者++地址变量(pi),结果为在pi地址值位置跳过pi所指类型字节数个字节后的地址。分前++和后++。--:地址变量(pi)--或者--地址变量(pi),结果为在pi地址值位置跳回pi所指类型字节数个字节后的地址。分前--和后--。C程序设计快速进阶大学教程2020/9/202511.3.1一维数组与指针1.指针相关的运算符(5)关系运算。支持6种关系运算符,用来比较地址的大小。例如:&iArr[1]&iArr[3]为真;piiArr+3为真(pi的值为iArr)。C程序设计快速进阶大学教程2020/9/2
本文标题:C语言指针精品课件
链接地址:https://www.777doc.com/doc-7028874 .html