了解指针与指针变量的概念.ppt

上传人:牧羊曲112 文档编号:5186402 上传时间:2023-06-12 格式:PPT 页数:65 大小:282KB
返回 下载 相关 举报
了解指针与指针变量的概念.ppt_第1页
第1页 / 共65页
了解指针与指针变量的概念.ppt_第2页
第2页 / 共65页
了解指针与指针变量的概念.ppt_第3页
第3页 / 共65页
了解指针与指针变量的概念.ppt_第4页
第4页 / 共65页
了解指针与指针变量的概念.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《了解指针与指针变量的概念.ppt》由会员分享,可在线阅读,更多相关《了解指针与指针变量的概念.ppt(65页珍藏版)》请在三一办公上搜索。

1、1,1.了解指针与指针变量的概念,指针与地址运算符,指针与数组。2.掌握一维数组的定义、初始化和访问,了解多维数组的定义、初始化和访问。3.了解结构体和共用体的定义和访问。,第五章 指针、数组、结构体和共用体,2,第5章 内容,5.1 指针类型5.2 数组 5.3 结构体和共用体,3,1)地址的引入2)指针变量的定义3)指针变量的运算4)const 对指针变量的约束,5.1 指针类型,4,1)地址的引入,计算机内存由若干存储单元构成,每个存储单元有一个编号;存储单元的编号,称为相应数据的指针(地址)。在一个程序中,内存分配的顺序 是从后向前,从右向左。例如,对:int i;/(先声明,放在高位

2、)double j;/(后声明,放在低位)则在内存中的存储为:,5.1 指针类型,复习:变量:是机器一个内存位置的符号名 在该内存位置可以保存数据,并可通过符号名进行访问。&:取地址运算符,&a为变量a的地址。*:指针运算符,,int a=3;,5,2)指针变量的定义,用于存储其他变量的地址的变量,为指针变量。定义方法:数据类型*指针名;如:int i;int*pi=/定义指针变量pi,并取i的地址赋给pi 即指针变量其名为pi,其值为&i注意 使用变量名不带*号,指针名带*表示取值。指针的数据类型与所指的数据类型相同;指针可以动态的,(可在指向一个变量后,再指向其他变量)。,5.1 指针类型

3、,6,2)指针变量的定义与使用 int a=2,b=3;int*pa,*pb;pa=/OK*pa=*pb/ok,将b 地址中的值,赋给 a地址指向的空间 pa=pb;/指针变量可用另一个指针变量赋值,7,/源程序:2_2.cpp#include int main()int a=2,b=3;int*pa,*pb;pa=,5.1 指针类型,8,/问题:指针的引用/源程序:5_3.cpp/#include int main()int a=2,b=3;int*pa,*pb;pa=,指针变量可用另一个指针变量赋值。pa=pb;,9,/问题:指针变量的应用/源程序:5_4.cpp#include int

4、main()int a=2,b=3;int*pa,*pb,*max;pa=,10,3)指针变量的运算 指针变量的运算包括:(1)单指针变量的运算(2)指针间的减法(3)指针间的比较,5.1 指针类型,11,(1)单指针变量的运算。指针使用前,必须检查其是否为空 如对 int*p;用if(p=NULL)来判断是否为空。指针变量的单目运算 p+n 表示找到与当前指针偏移n个内存地址偏移量的位置。(p本身的值保持不变)示例1:int a,b,c;int*pc=则 pc+1/找到位置&b pc+2/找到位置&a,5.1 指针类型,12,/问题:单指针运算/源程序:5_5.cpp#include int

5、 main()int a1=1,a2=2,a3=3,a4=4;int*pi=,5.1 指针类型,13,(2)指针间的减法 int a=1,b=2,c=3,d=4;int*pa=pa-pb 结果是3 单位为int的长度,即地址相差34=12字节。注意的是两指针的相加、乘、除以,一般是无意义。,5.1 指针类型,14,(3)指针间的比较 一般地 对变量:先声明的变量,比后声明的变量,地址值大;指针的关系运算 同类型的指针,可进行关系运算 可用关系运算符号!=、=、=、,5.1 指针类型,15,(3)指针间的比较/示例 5-7#include int main()int a=1,b=2,c=3;in

6、t*pa=,5.1 指针类型,16,总结对变量 int a=3;int/通过指针,5.1 指针类型,17,4.2.4 指针参数,函数定义中,形参定义成指针类型变量;指针参数的函数调用 将实参地址赋给形参。与引用传递一样,函数执行中,会将形参和实参一同修改.示例 int add(int*x,int*y)/函数声明 add(/错误,常量不能找到地址,传不过去,4.2 函数参数的传递,18,/问题:测试指针参数/源程序4_8.cpp#include void swap(int*,int*);int main()int m=10,n=20;coutm=mtn=nendl;swap(,19,4.4 函数

7、的指针,1)函数的地址2)函数的指针,20,4.4函数指针,1)函数的地址函数被编译成二进制码存入内存,存储函数的空间的首地址,称为函数地址.函数地址,是执行函数的入口.三种形式来调用函数:max(a,b);/函数名调用(/间接地址调用,21,/问题:函数地址的测试/源程序4_12.cpp#include int max(int x,int y);int main(int argc,char*argv)int x=0,y=0,z=0;x=max(5,3);/函数名调用y=(,22,2)函数的指针指针,用语存储其他数据的地址.利用指针,可操作地址;函数指针和数据指针一样,要先定义后使用。示例 定

8、义一个char(int)类型的函数指针tr,就可以这样表示:char(*tr)(int);(*tr)的括号在这里不能省,因为在这里只是定义一个函数指针,不是声明一个函数。,4.4函数指针,23,/问题:函数指针的使用/源程序4_13.cpp#include double squarePerimeter(double);/正方形的周长double squareArea(double);/正方形的面积double cubeArea(double);/立方体的面积double cubeVolume(double);/立方体的体积,24,int main(int argc,char*argv)doub

9、le(*fp)(double);/定义函数指针double sL=5;/初始化边长double sP,sA,cA,cV;fp=squarePerimeter;/函数指针赋值sP=fp(sL);fp=squareArea;/修改函数指针sA=fp(sL);fp=cubeArea;/修改函数指针cA=fp(sL);fp=cubeVolume;/修改函数指针cV=fp(sL);cout边长是:sLendl;cout正方形的周长是:sPendl;cout正方形的面积是:sAendl;cout正方体的面积是:cAendl;cout正方体的体积是:cVendl;return 0;,25,double sq

10、uarePerimeter(double sideLength)return sideLength*4;double squareArea(double sideLength)return sideLength*sideLength;double cubeArea(double sideLength)return sideLength*sideLength*6;double cubeVolume(double sideLength)return sideLength*sideLength*sideLength;,26,char(*tr)(int);/tr为指向函数的指针,该函数返回一个字符ch

11、ar*tr(int);tr为返回一个指针的函数,该指针指向字符型数据,#include char*fun(char tt)for(int i=0;tti;i+)if(ttia),函数指针与返回指针类型的函数,27,4)const 的约束 通过添加const 关键词,可对指针中的地址值,或指针地址中的数据内容,规定为不变。(1)指向常量的指针无论指向哪个数据,都以“只读”的形式指向,即不能用指针变量的间接形式去修改数据。格式 const 数据类型*指针变量名/格式1 数据类型 const*指针变量名/格式2 举例 const int*pi;/也可书写为 int const*pi;int a=22

12、;pi=/错误,5.1 指针类型,28,4)const 的约束(2)指针常量指针常量,是指在初始化后,不能再修改它的指向。格式数据类型*const 指针变量名举例int a=22;int*const p=/错误,5.1 指针类型,29,4)const 的约束(3)指向常量的指针常量指针本身和所指对象的值,在定义之后都限制为只读的指针。既不能通过指针去修改指向的变量的值,又不能更改指向格式const 数据类型*const 指针变量名/格式1数据类型 const*const 指针变量名/格式2举例const int*const p=,5.1 指针类型,30,5.2 数组,定义 用一个名称,表示一组

13、数据类型相同,并连续存储的多个数据的集合。包括 1)一维数组 2)多维数组 3)字符数组和字符串 4)指针数组,31,1)一维数组(1)定义定义格式 数据类型 数组名 长度表达式;示例 int a5;double b10;int c0;/c有48个元素注意 数组长度必须是整型表达式。C+中,数组下标从0开始。长度为n的数组,下标从0到n-1。对a,其元素依次为 a0 a1,,a4,5.2 数组,32,1)一维数组(2)初始化 数组可在定义时依次对元素赋值,并可省略长度。int a3=1,2,3;/等同于int a=1,2,3;int a3=1,2,3,4;/错误,下标超过数组长度也可定义后,按

14、下标,对每个元素赋值。int a3;a0=1;a1=2;a2=3;注意 未初始化的确数组元素,会被赋一个随机数。示例:书上代码5_8,5.2 数组,33,/问题:数组的定义与初始化/源程序:5_8.cpp#include int main()int a3=1,2,3;int b3=1;int i;double d3;d0=1.1;d1=2.2;d2=3.3;static int e4;/对静态数组,自动初始化const int f2=10,20;/const约束的数组coutarray a:;for(i=0;i=2;i+)coutai;coutendl;/显示a数组元素coutarray b:

15、;for(i=0;i3;i+)coutbi;coutendl;/显示b数组元素coutarray d:;for(i=0;i3;i+)coutdi;coutendl;/显示d数组元素coutarray e:;for(i=0;i4;i+)coutei;coutendl;/显示e数组元素return 0;,34,1)一维数组(3)数组访问 访问方式1 通过数组名 加 下标 访问。int a3=1,2,3;a0+=1;cout*(a+1);/输入第2个元素的值 示例:书上代码5_10,5.2 数组,35,/问题:以数组下标访问/源程序:5_9.cpp/#include int main()int a1

16、0;int i;for(i=0;i10;i+)ai=i;/写入for(i=0;i10;i+)/输出数组a的全部元素coutai“”;/读出coutendl;couta10endl;/越出数组a的界限,编译器不检查;输出随机数return 0;,36,以指针方式访问数组 对int a5=1,2,3,4,5;int*p=/p指向a的地址此时,有*p 与 a0 相等/*(p+1)与 a1 相等*(p+2)与 a2 相等*(p+3)与 a3 相等*(p+4)与 a4 相等,37,/问题:以指针方式访问数组/源程序:5_10.cpp#include int main()int a=1,2,3,*p,i;

17、cout a=aendl;/显示指针a的数值cout,38,2)多维数组 多行、多列、多分枝的同类型数据组成的集合。(1)定义 int a24;/2行4列 int a245;/2行4列5分枝 多于三维的确数组,应用较少。(2)初始化 int a24=1,2,3,4,5,6,7,8;/按行 int a24=1,2,3,4,5,6,7,8/前4个初始化第1行,int b223=1,2,3,4,5,7,8,9,10;,5.2 数组,第1行,第2行,39,/问题:多维数组/源程序:5_11.cpp#include int main()int i,j,k;int a3=1,2,3,4,5,6,7,8,9

18、;int b223=1,2,3,4,5,7,8,9,10;for(i=0;i3;i+)coutaij:;for(j=0;j3;j+)/2维数组,用三层for 循环coutaij;/显示数组a的各元素coutendl;for(i=0;i=1;i+)for(j=0;j=1;j+)coutbijk:;for(k=0;k=2;k+)/3维数组,用三层for 循环coutbijk;/显示数组b的各元素coutendl;return 0;,40,3)字符数组与字符串,(1)字符数组 数组元素存储的是单个的字符。定义和初始化方法与其他数组相同。示例:char a4=1,2,3,4;char b=1,2;ca

19、hr c3;c0=a,c1=b,c2=c;char d 2=a,b,c,d,e,f;注意:为数组赋值的字符要放在单引号中。,5.2 数组,41,(2)字符串的定义一维字符数组,可用于存储一个字符串。当要用字符数组存储字符串时,字符串的结尾须加上0;char a12;a0=h,a1=e,a2=l,a3=l,a4=o,a5=0;coutaendl;/输出”hello”,与字符指针的输出一样 0是指ASC码值为0的字符,不能显示,只代表一个“空操作”的标记。,3)字符数组与字符串,5.2 数组,42,/问题:字符串/源程序:5_12.cpp;_字符串的定义#include int main()cha

20、r a10=H,e,l,l,o,!,0;char b12=CHINA BOY;/可省略大括号/char b212;b=CHINA BOY;/错误!不能在字符数组定义后用串对它初始化char c=C+Language;char*d=Welcome!;/char*d2=W,e,l,c,o,m,e,!,0;/错误!不能用数组元素形式对字符指针初始化char*d3;d3=Welcome!;/正确!char e15=Hello!,CHINA BOY,C+Language;coutarray a:aendl;coutarray b:bendl;coutarray c:cendl;coutarray d:d

21、endl;coutarray d3:d3endl;for(int i=0;i3;i+)coutarray ei:eiendl;return 0;,43,(3)字符数组的访问 通过字符数组名,可输入和输出一个字符传;通过字符数组 加 下标,可以输入和输出单个字符。char a3=“h!”/整个输入 cina0;/单个输入 couta;/整个输出 couta0;/单个输出,3)字符数组与字符串,5.2 数组,44,用字符指针存储字符串 char*p=new char10;p=“a string”;cinp;/输入字符串 coutp;/输出字符串 示例 见书代码 5-13,45,(4)字符串处理函数

22、 int strlen(s)返回字符指针的字符串长度 char*p=n12valuen;coutstrlen(p)endl;char*strcat(s1,s2)将字符指针s2 添加到字符指针 s1 的后面,返回s1char*strcpy(s1,s2)将字符指针s2的内容,复制到字符指针s1 中,返回s1。int strcmp(s1,s2)上述参数,可字符串数组,或字符指针。,3)字符数组与字符串,5.2 数组,46,/问题:字符串的处理函数/源程序:_14.cpp#include#include int main()char s120=C+,*s2=Language,*s3=new char;

23、/初始化cout0)coutcharacter array s1 greater than s2;else coutcharacter array s1 less than s2;coutendl;return 0;,47,4)指针数组 存储指针变量的数组,其中每个元素都是一个指针变量,需要指向相同类型变量或对象的。在实际应用中一般只使用一维指针数组。格式 数据类型*数组名长度;其中“”说明要定义一个数组;“*”说明该数组的元素为指针。,5.2 数组,48,4)指针数组示例1 int a,b,*p2;p0=/输出的结果是字符串,5.2 数组,49,1 从静态存储区域分配。内存在程序编译时候已经

24、分配好,这块内存在程序整个运行期间都存在。对应的就是:全局变量,static变量 2 从栈上创建。函数内局部变量申请的存储单元在栈上创建,函数结束时栈空间自动释放。比如:int a;int*p=这样返回的地址就不知道指向的是什么东西了。3 从堆上分配,亦称动态分配。运行时用 malloc(c语言中使用)或者new(c+语言中使用)申请内存,程序员自己负责 用free或者delete释放,因此生存期是由我们来定的。即使在函数体内声明的也不会随函数结束而消失。,50,/问题:指针数组/源程序:_15.cpp#include int main()int*p2;char*q3;int i,a3=1,2

25、,3;p0=a;/指针变量p0,指向数组p1=new int2;/申请内存空间p10=4;p11=5;/逐个赋值coutp0:;for(i=0;i3;i+)coutp0i“;/显示p0指向的数组内容,3个coutendl;coutp1:;for(i=0;i2;i+)coutp1i“”;/显示p1指向的内容,2个 coutendl;coutq:;q0=Hello!;q1=China;q2=Boy.;/指针数组元素初始化 for(i=0;i3;i+)coutqi;/显示指针数组元素所指向的内容coutendl;return 0;,5.2 数组,51,指针的类型:指针类型,是它指向的变量的数据类型。

26、可以是:基本类型:int,char,非基本类型:结构,对象,以及指针等。,(指向指针的指针,又称二级指针),52,int i=4;int*p1=,指向指针的指针变量定义:类型标识符*指针变量名 例如:int*ptr;其含义为定义一个指针变量ptr,它指向另一个指针变量(该指针变量又指向一个实型变量)。由于指针运算符“*”是自右至左结合,所以上述定义相当于:int*(*ptr);,4,i,&i,p1,&p1,p2,指向指针的指针,53,#include main()int a10=1,2,3,4,5,6,7;int b34=1,2,3,4,5,6,8,8,10,11;int*p1,*p2,*p3

27、,i,j;/*p3是指向指针的指针变量 for(p1=a,p3=,指向指针的指针,54,5.3 结构和共用体,1)结构的定义2)访问结构成员3)结构赋值4)结构与指针5)共用体的定义6)共用体变量的引用,55,1)结构的定义 结构是一种自定义数据类型,用于多个不同类型数据,共同表达某一对象信息的情况。定义格式 struct 结构体名 数据类型1 成员1;数据类型2 成员2;数据类型n 成员n;结构体变量名;省略“结构体名”时,表示说明一个无名结构;省略“结构变量名”,表示暂时不定义具有该类型的变量。,5.3 结构和共用体,56,1)结构的定义示例 struct student int num;

28、/学号 4字节char name10;/姓名 10字节char sex;/性别 1字节char sclass20;/所在班级 20字节int age;/年龄 4字节;student std;/定义一个结构变量 std;coutsizeof(student);/输出40字节,采用最大成员数据类型的倍数,5.3 结构和共用体,57,2)结构成员的访问结构体变量名.成员名示例 struct student int num;/学号 4字节char name10;/姓名 10字节char sex;/性别 1字节char sclass20;/所在班级 20字节int age;/年龄 4字节 std=19,

29、liuyang,Y,2class,18;coutstd.nameendl;,5.3 结构和共用体,58,3)结构的赋值 struct student/书上代码5-16的主函数部分int num;/学号char name10;/姓名char sex;/性别int age;/年龄struct data/入学时间int year;/年int month;/月int day;/日sdata;s1=2001,Li Ming,m,21,2007,9,1;/同时定义变量并初始化student s2;s2.num=2002;/逐个赋值strcpy(s2.name,Jiang Tao);s2.sex=m;s2.

30、age=22;=2007;=9;=1;,5.3 结构和共用体,59,4)结构与指针 指向结构变量地址的指针变量,称为结构指针。示例1student*p=/等同于上一语句,5.3 结构和共用体,60,4)结构与指针 可用结构指针,指向一个结构数组。这样通过便移结构指针,可指向结构数组中的每个结构元素。示例1:student std3=19,”liuyang”,20,”lirong”,21,”geyang”;student*p=s;coutnum;p+;coutnum;示例2 书上代码 5-17,5.3 结构和共用体,61,/问题:指向结构数组的结构指针,/源程序:5_17.cpp#include

31、 include int main()struct studentint num;char name10;char sex;int age;struct dataint year;int month;int day;sdata;student s3=2001,Li Ming,m,21,2007,9,1,2002,Chen Bin,m,22,2007,9,1,2003,Yu Jing,w,23,2006,9,1;student*p;for(p=s;pnumnamesexagesdata.yearsdata.monthsdata.dayendl;return 0;,62,5)共用体的定义 与结构的

32、定义方法相同,格式为:union 共用体名数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;共用体变量名;结构可以初始化全部成员,而共用体只能初始化一个成员。,5.3 结构和共用体,63,5)共用体变量的引用,共用体变量的大小,是共用体中最大数据成员的大小 union un int a;char b;float c;/大小为4 当只对共用体变量中的某个成员赋新值时,其他成员的值也会被该新值覆盖。un un1;un1.a=97;coutun1.bendl;/un1.b中装的97对应的字符 coutun1.cendl;/则被初始化为一个随机值 示例1 见书代码 5-17,5.3 结构和共用体,64,6)共用体变量的引用与结构变量的引用方法相同。union unint a;char b;flaot c;则可以这样对共用体变量引用:un u1;u1.a=1;u1.b=b;un*p=,5.3 结构和共用体,65,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号