第五章 指针的应用 C++

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章指针的应用指针的概念简单,使用广泛、灵活、复杂。正确使用指针,能有效使用各种复杂数据结构,动态分配内存,高效使用数组和字符串,编写通用程序等;使用指针不当,可导致程序运行出错或死机。学习建议:理解指针本质,多用指针编程,多调试,不怕出错。教学目标:1.重点介绍指针与指针变量的概念;2.指针类型变量的定义、赋值以及引用的方法;3.指针与地址运算符;4.通过指针类型的变量去访问普通变量;5.通过指针类型的变量去操作一维数组;6.通过指针类型的变量去操作二维数组;7.动态存储分配的概念及应用。§5.1指针的概述#includeiostreamusingnamespacestd;voidmain(){inta;int*p;a=10;p=&a;couta的值表示方法1:aendl;couta的值表示方法2:*pendl;couta的地址表示方法1:&aendl;couta的地址表示方法2:pendl;}[例5.1]指针变量变量的地址…200210…20022006ap当定义变量时系统配置一个“按指定数据类型大小的内存空间”§5.1指针的概述#includeiostreamusingnamespacestd;voidmain(){inta;int*p;a=10;p=&a;couta的值表示方法1:aendl;couta的值表示方法2:*pendl;couta的地址表示方法1:&aendl;couta的地址表示方法2:pendl;}[例5.1]§5.1关于指针1.指针是C++从C中继承过来的重要的概念,它提供了一种较为直观的地址操作的手段。正确地使用指针,可以方便、灵活而有效地组织和表示复杂的数据结构。2.利用指针可以进行动态内存分配和管理,可以更灵活地使用内存空间。3.为了理解指针,要先理解关于内存地址的概念。1.内存地址的概念内存单元:可直接访问的计算机内存的最小单位。多数计算机以一个字节为一个最小的内存单元。内存单元的地址:为每一内存单元所指定的一个唯一编号,以区分不同内存单元。存储单元:一个变量所分得的连续内存单元的总和。当说明一个变量时,系统为该变量分配一个连续的内存单元,即一个存储单元。存放在内存储器中的程序和数据都有一个地址,用它们占用的那片存储单元中的第一个内存单元的地址表示。设有说明语句:charc='a';floatx=50.5f;在程序执行时,系统为变量c和x分配内存单元(设分配的内存单元分别为20000和20004),如图所示。注意区分变量的地址和变量的值。变量c的地址和值(1)直接访问方式:通过变量名,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。2.从内存单元中存取数据的方法(2)间接访问方式:通过地址访问,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。2.从内存单元中存取数据的方法(3)有时使用变量名不够方便或者根本没有变量可用,这时就需要直接用地址来访问内存单元。例如,在不同的函数之间传送大量数据时,如果不是传递变量值,而是只传递变量的地址,就会减小开销,提高效率。如果是动态分配的内存单元,则根本就没有名称,这时只能通过地址访问。§5.2指针变量的定义、赋值及使用1.如何通过地址来操作呢?在C++中专门用一种数据类型,称为“指针”数据类型来表示“地址”,指针实际上是某个存储单元的首地址。2.程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元,即都有地址。C++规定:(1)变量的地址:&变量名(2)数组的地址:数组名或&数组名[0](3)函数的地址:函数名三个需要明确的概念指针:内存单元的地址,用于间接访问。变量的指针:变量在内存中存放的起始地址。指针变量:用于存储地址的变量。这个地址既可以是变量的地址,也可以是数组、函数的地址。#includeiostreamusingnamespacestd;voidmain(){intx=8,*p,*q,a=3;int*pa=&a;p=&x;q=p;cout*pendl*qendl*paendl;}[例5.2]…200D2001820052009xp320012001qapa1、指针变量的定义数据类型*指针变量名数据类型*指针变量名=地址①定义语句中的“*”表示该变量为指针变量。②数据类型标识符规定了指针变量指向的数据类型,而不是指针自身的类型。任何一个指针本身的数据值都是unsignedlongint型。指针变量的值是一个地址,取值范围是内存地址范围,在PC机中用4个字节来存放地址值,即不同类型的指针变量所分配的存储单元大小相同。例如:声明语句:int*p;int*q;“*”表示该变量p、q均为指针变量(一个*只能表示一个指针);且指针变量p、q只能操作整型数据。(一个指针变量只能存储同一种类型变量的地址。)2、指针变量的赋值(1)定义时赋值数据类型*指针变量名=地址;例inti=200,j;int*iptr=&i,*jptr=&j;double*pd=NULL;(2)用赋值语句将指针变量初始化指针变量名=地址;C++规定:(1)变量的地址:&变量名(2)数组的地址:数组名或&数组名[0](3)函数的地址:函数名(3).把字符串的首地址赋予字符型指针变量例char*pc;pc=WelcometoC++world!;或char*pc=WelcometoC++world!;注意:把字符数组首地址(即字符’W’的内存地址)赋予指针变量pc。pcWelcometoC++world!\0说明:①已赋初值的指针可以初始化另一个指针变量。②用变量地址作为初值时,该变量的定义必须在指针初始化之前。③不能对常量或表达式以取址方式进行运算。例如:P=&67;P=&(i+5)是非法的。④不能将一个非0整数直接赋给指针变量,但可以赋整数值0或NULL,表示该指针为空指针。例如:int*p;p=0;p为空指针,不指向任何地址。char*pc=NULL;/*NULL为符号常量,其代码值为0。表示pc是空指针,即pc不指向任何存储单元。*/⑤允许声明指向void类型的指针,该指针可以被赋予任何类型对象的地址。但若将它赋给其它类型的指针变量时,应做强制类型转换。void*general;int*point,i;charc;floatf;doubled;general=&i;general=&c;general=&f;general=&d;point=(int*)general;3.指针变量的使用#includeiostreamusingnamespacestd;voidmain(){intx,*p;p=&x;cin*p;cout*pendl;}取地址符&,获取变量x的存储单元地址指针运算符*,表示指针变量所指向的变量的值(1)*指针运算符也称为“间接访问”运算符,是一个一元运算符,表示指针变量所指向的变量的值。(2)&取地址运算符是一个一元运算符,用来得到一个对象的地址,取地址运算符的操作数必须是变量名。3.指针变量的运算2.指针变量使用一定要先定义后使用,在使用前要进行初始化或赋值,指针未赋值将非常危险。例如:#includeiostreamusingnamespacestd;voidmain(){intx=26;int*ptr;*ptr=58;//此时ptr是一个随机地址coutxendl;}很可能已经破坏了另一变量的值,甚至修改了函数的返回地址等。*出现在定义语句中和执行语句中,含义不同:#includeiostreamusingnamespacestd;voidmain(){intx,*p;x=3;p=&x;*p=*p+10;cout*pendl;}指针定义符指针运算符13#includeiostreamusingnamespacestd;voidmain(){inta,*p;a=10;p=&a;cout*&aendl&aendl&*pendl*&pendl;}#includeiostreamusingnamespacestd;voidmain(){intx=8,*p,*q,a=3,*pa=&a;p=&x;q=p;cout*pendl*qendl*paendl;}#includeiostreamusingnamespacestd;voidmain(){intx=5,*p,y;p=&x;y=*&x;cout*pendl;coutyendl;}55#includeiostreamusingnamespacestd;voidmain(){inti,int*p;i=10;p=&i;coutiendl;cout*p+2endl;}1012§5.3简单变量与指针指针的类型是它所指向变量的类型。指针值不是整型数,在使用中必须类型匹配。如:intx=26;int*ptr=&x;//定义指针变量*ptr=&x;//error:不能将整型地址转换成整型数*ptr=50;//执行语句:*在此处作间接引用可以对不同的类型作强制转换,如:*ptr=(int)&x;表示将变量x的地址值作为一个整型数赋给变量*ptr,即变量x。[例5.4]输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。思路分析:输入两个整数,判断谁大谁小,若a大输出a,b;若a小输出b,a。#includeiostream#includeiomanipusingnamespacestd;voidmain(void){inta,b*p1=&a,*p2=&b;coutinputaandb:endl;cin*p1*p2;if(*p1*p2)cout*p2setw(4)*p1endlelsecout*p1setw(4)*p2endl;}源程序清单:思考:上例中:修改为p1指针指向大数所在变量,p2指针指向小数所在变量,然后输出。§5.4一维数组与指针指针变量的算数运算指针加一,减一运算指向下一个或前一个数据指针与整数的加减运算指针加上n或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。指针变量的值实际加或减n×sizeof(指针变量类型)。y=*px++相当于y=*(px++)(*和++优先级相同,自右向左运算)pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int*pb例指针与整数的加减运算#includeiostreamusingnamespacestd;voidmain(){inta,*p1,*p2;doubleb,*p3,*p4;p1=&a;p3=&b;coutp1p3endl;p2=p1+1;p4=p3+1;coutp2p4endl;p2=p1+5;p4=p3+5;coutp2p4endl;}程序运行结果为:0x0012FF7C0x0012FF6C0x0012FF800x0012FF740x0012FF900x0012FF94例5.5阅读如下程序:#includeiostreamusingnamespacestd;voidmain(){chara[10]=abcdefghi;char*p1;p1=a;//指针变量p1指向数组a的首地址p1+=2;//指针变量p1做算术运算,加上2,指向数组a的第三个数组元素的内存单元cout*p1endl;//输出数组的第三个数组元素的值字母c}指针变

1 / 105
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功