




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-2-3-2000022002int a;-4-#include int main()short sVar = 5;long lVar = 65535;float fVar= 3.14f;std:coutShort:tsVartAdd:t&sVarn;std:coutLong:tlVartAddr:t&lVarn;std:coutFloat:tfVartAddr:t&fVarn“;return 0;p取变量地址运算符:取变量地址运算符:& &sVarsVar。ptt为转义字符,输出一个制表符。为转义字符,输出一个制表符。 用于输出用于输出 ,输出双引号,
2、输出双引号, 输出输出 单引号单引号p每个变量都有确定的地址每个变量都有确定的地址p编译器确定应分配内存编译器确定应分配内存 的数量,及对应的地址的数量,及对应的地址p程序员不用关心地址的细节,程序员不用关心地址的细节, 只需知道如何访问变量即可只需知道如何访问变量即可-5-p定义变量时,变量名定义变量时,变量名pAgepAge前面的前面的* *,表示,表示pAgepAge是一个变量,是一个变量, 用来存储一个整型变量的地址,用来存储一个整型变量的地址, 编译器会为指针变量分配内存单元。编译器会为指针变量分配内存单元。p指针变量的类型:可保存其地址的变量数据类型。指针变量的类型:可保存其地址的
3、变量数据类型。pNULLNULL为预定义常量,表示空指针,为预定义常量,表示空指针,NULLNULL通常等价于通常等价于0 0。p良好编程习惯:定义指针变量时应对其执行初始化,未初良好编程习惯:定义指针变量时应对其执行初始化,未初 始化的指针称为野指针,非常危险。始化的指针称为野指针,非常危险。-6-p指针变量中存储的地址值实际上是一个整数值,但不能将指针变量中存储的地址值实际上是一个整数值,但不能将 整数值直接赋值给指针变量。整数值直接赋值给指针变量。p赋值时,取地址的变量类型必须与指针变量类型一致。否赋值时,取地址的变量类型必须与指针变量类型一致。否 则编译器报错。则编译器报错。-7-8-
4、9-#include int main()int myAge;int *pAge=&myAge;myAge=5;std:coutMyAge:tmyAgen;std:cout*pAge:t*pAgen;*pAge=7;std:coutMyAge:tmyAgen;std:cout*pAge:t*pAgen;return 0;-10-11-12-void swap( int *x, int *y )int temp; temp = *x;*x = *y;*y = temp;std:cout *x , *y std:endl;#include void swap( int *a, int *b
5、 );int main()int a = 3, b = 2;swap(&a, &b);std:cout a , b std:endl;return 0;-13-p指针变量指针变量papa指向数组指向数组a ap传递数组的本质上只是传递数组起始地址,在传递数组的本质上只是传递数组起始地址,在averageaverage 函数中,通过指针变量间接访问数组元素。函数中,通过指针变量间接访问数组元素。p指针变量指针变量papa指向数组指向数组a+1a+1-14-#include double average( int array, int size);const int N = 10;
6、int main()int aN;int *p = a; /或者p = &a0;for(int k=0; kN; k+)* ( p + k ) = k;double ave ;ave = average(a, N);std:cout average= ave n;return 0;或者或者pk=k;或者或者( int *array, int size);或者(或者(int *, int );-15-int average( int array, int size)int sum=0;for(int i=0; isize; +i)sum+=arrayi;return sum/size;p
7、数组本身并不包含数据元素个数的信息,传递数组或指针数组本身并不包含数据元素个数的信息,传递数组或指针 时,往往传递辅助参数表示元素个数。时,往往传递辅助参数表示元素个数。或者或者sum += *(array + i);int *p ;for(p = array; p array + size ; p+)sum += *p;-16-17-18-p局部变量随着函数的返回被丢弃,无法再访问。局部变量随着函数的返回被丢弃,无法再访问。p全局变量存在于整个程序的运行期间,整个程序中都能全局变量存在于整个程序的运行期间,整个程序中都能 访问,但全局变量容易出错、难以理解与维护,避免使用。访问,但全局变量容
8、易出错、难以理解与维护,避免使用。-19-20-p从堆中分配可存储从堆中分配可存储1 1个个intint数据的空间。数据的空间。p堆中分配的内存,没有对应的变量,只能通过指针间接访问堆中分配的内存,没有对应的变量,只能通过指针间接访问p从堆中分配内存可能会失败,使用指针前一定要判断是否从堆中分配内存可能会失败,使用指针前一定要判断是否 分配成功。老式编译器失败后返回分配成功。老式编译器失败后返回NULLNULL指针,新的编译器指针,新的编译器 会抛出异常(后面讨论)。会抛出异常(后面讨论)。-21-p分配堆空间时,可以指定分配数据的数量,从而请求可保存分配堆空间时,可以指定分配数据的数量,从而
9、请求可保存 多个数据的存储空间。多个数据的存储空间。p* *pPointerpPointer访问所指向的第一个数据,访问所指向的第一个数据,* *(pPointer+n)(pPointer+n)访问之访问之 后的第后的第n n个数据,注意不能超过所分配的内存界限。个数据,注意不能超过所分配的内存界限。-22-p动态请求的多个数据,如果只使用动态请求的多个数据,如果只使用deletedelete释放,将造成内存释放,将造成内存 泄漏。泄漏。-23-#include int main()int *pHeap = new int;if(pHeap = NULL)std:coutError! No m
10、emory for pHeap!n;return 1;*pHeap = 7;std:cout*pHeap: *pHeapn;delete pHeap;return 0;-24-pdeletedelete指针后,该指针将成为悬摆指针(或野指针、迷失指针后,该指针将成为悬摆指针(或野指针、迷失 指针),解析或再次指针),解析或再次deletedelete该指针,会导致程序崩溃。该指针,会导致程序崩溃。p良好编程习惯:对指针执行运算前,判断该指针是否为良好编程习惯:对指针执行运算前,判断该指针是否为NULLNULL-25-void fun()int *pa = new int(5);*pa = 10
11、;delete pa;std:cout pa std:endl;2000pa52000pdeletedelete只是释放只是释放papa所指向的堆空间,对指针所指向的堆空间,对指针papa本身没有任何本身没有任何 影响。此时影响。此时papa仍然指向原先的内存位置,变成了野指针。仍然指向原先的内存位置,变成了野指针。ppapa是位于栈中的局部变量,是位于栈中的局部变量,funfun返回后返回后papa由系统自动销毁。由系统自动销毁。-26-ppNumberpNumber指向新分配的存储空间后,原先分配的内容为指向新分配的存储空间后,原先分配的内容为7575的的 内存无法访问,也无法再释放!内存
12、无法访问,也无法再释放!-27-&典型情况二:在函数内分配的内存空间,函数返回之前没有释放void fun()int *pa=new int;*pa = 5;int main()fun(); 2000 pa52000-28-29-p创建对象时会调用类的构造函数,此处调用缺省构造函数创建对象时会调用类的构造函数,此处调用缺省构造函数p每当在栈中或堆中创建对象时,都将调用构造函数。每当在栈中或堆中创建对象时,都将调用构造函数。p执行执行deletedelete操作后,将调用对象的析构函数,然后释放堆操作后,将调用对象的析构函数,然后释放堆 中的内存(对象本身)。中的内存(对象本身)。-30
13、-2000 myRectangleRectangle *my Rectangle = new Rectangle;. /使用使用my Rectangledelete myRectangle;300430002000 lengthwidth523000-31-32-#include class Apublic:A(int x=0) this-x = x;int getX() return x; void setX(int x) this-x = x; private:int x;int main() A *myA = new A;std:coutmy A is getX() setX(4);st
14、d:coutmyA is (*myA).getX() n;delete myA;return 0;-33-34-prSomeIntrSomeInt是一个是一个intint引用,被初始化指向引用,被初始化指向someIntsomeInt。p将来对将来对rSomeIntrSomeInt的操作都等价于对的操作都等价于对someIntsomeInt的操作。的操作。-35-#include int main()int intOne;int &rSomeRef = intOne;intOne=5;std:coutintOne: intOnen;std:coutrSomeRef: rSomeRefn
15、;rSomeRef=7;std:coutintOne: intOnen;std:coutrSomeRef: rSomeRefn;return 0;-36-37-prSomeIntrSomeInt仍然引用的是仍然引用的是someIntsomeInt,通过赋值运算符,只是,通过赋值运算符,只是 将将anotherIntanotherInt的值赋给的值赋给rSomeIntrSomeInt,也就是,也就是someIntsomeInt。-38-39-40-41-void swap( int &rx, int &ry )int temp;temp=rx;rx=ry;ry=temp;std:
16、cout rx “ , “ ry std:endl;prxrx和和ryry是是x x和和y y的引用,调用的引用,调用swapswap时没有创建新的局部变时没有创建新的局部变 量,对量,对rxrx和和ryry的操作就是对的操作就是对x x和和y y的操作。的操作。#include void swap( int &rx, int &ry );int main()int x=5, y=10;swap(x, y);std:cout x “ , y std:endl; return 0;-42-43-bool factor(int n, int &pSquared, int &
17、amp;pCubed)bool flag = false;pSquared= n * n;pCubed = n * n * n;if( pSquared 0 | n * pCubed 0 )flag = false;elseflag = true;return flag;p返回多个值(引用)返回多个值(引用)pflagflag记录计算结果是否越界记录计算结果是否越界 如返回如返回truetrue表示计算成功,表示计算成功, 返回返回falsefalse表示计算失败。表示计算失败。p通过传入的引用将计算结果保存通过传入的引用将计算结果保存 到引用的变量。到引用的变量。-44-#include b
18、ool factor(int n, int &pSquared, int &pCubed);int main() int number, squared, scubed;bool flag;std:coutnumber;flag = factor(number, squared,scubed);if( flag )std:cout number: “ number n squared: “ squared n scubed: “ scubed n;elsestd:coutError encountered!n;return 0;-45-46-47-class Rectangle
19、public:Rectangle();Rectangle();int getLength() return *itsLength; int getWidth() return *itsWidth; void setLength(int length ) *itsLength = length; void setWidth(int width) *itsWidth = width; void output();private:int *itsLength;int *itsWidth;p为含有指针成员的类编写构造与析构函数。为含有指针成员的类编写构造与析构函数。-48-Rectangle:Rect
20、angle()itsLength = new int(2);itsWidth = new int(5);Rectangle:Rectangle()delete itsLength;delete itsWidth;void Rectangle:output() std:cout getLength() , getWidth() length = length; void setWidth(int width) this-width = width; void output();private:int length;int width;-51-p三种形式的含义不同三种形式的含义不同p若若const
21、const位于位于* *号左侧,表示指向内容为常量(内容受保护)号左侧,表示指向内容为常量(内容受保护) 若若constconst位于位于* *号右侧,表示指针本身为常量(指针受保护)号右侧,表示指针本身为常量(指针受保护)-52-ppOne:pOne:指向整型常量的指针,通过指向整型常量的指针,通过pOnepOne不能修改所指向变量不能修改所指向变量 的值;但可以指向别的整数。的值;但可以指向别的整数。-53-ppTwo:pTwo:指向整型的常量指针,指向整型的常量指针,pTwopTwo不能再指向其它变量,不能再指向其它变量, 但可以通过指针修改所指向变量的值。但可以通过指针修改所指向变量的
22、值。-54-ppThree:pThree:指向整型常量的常量指针,指向整型常量的常量指针,pThreepThree不能再指向其它不能再指向其它 变量,通过指针也不能修改所指向变量的值。变量,通过指针也不能修改所指向变量的值。-55-例例7-13完整源代码完整源代码-56-【例例7-14-1】对象的值作为函数的参数对象的值作为函数的参数【例例7-14-2】对象的指针作为函数的参数对象的指针作为函数的参数【例例7-14-3】对象的引用作为函数的参数对象的引用作为函数的参数-57-Rectangle FunctionOne(Rectangle r )return r;int main() Recta
23、ngle myRectangle;FunctionOne(myRectangle);return 0;p调用函数时创建调用函数时创建theCattheCat,调用复制构造函数复制,调用复制构造函数复制myCatmyCat 内容;函数返回后调用析构函数,并销毁内容;函数返回后调用析构函数,并销毁theCattheCat。p函数返回时创建临时对象,调用复制构造函数复制函数返回时创建临时对象,调用复制构造函数复制 theCat theCat的内容;最后要析构并销毁临时对象。的内容;最后要析构并销毁临时对象。-58-Rectangle* FunctionOne(Rectangle *r )return
24、 r;int main() Rectangle myRectangle;FunctionOne(&myRectangle);return 0;ptheCattheCat只是局部指针变量,接收只是局部指针变量,接收myCatmyCat的地址,不会的地址,不会 引起对象的复制构造以及返回后的析构函数调用。引起对象的复制构造以及返回后的析构函数调用。p函数返回临时指针变量,保存的是函数返回临时指针变量,保存的是theCattheCat存储的地址存储的地址 值,不会引起对象的复制构造以及析构。值,不会引起对象的复制构造以及析构。p指针变量占用的存储空间较少,可以忽略。指针变量占用的存储空间较少
25、,可以忽略。-59-Rectangle & FunctionOne(Rectangle &r )return r;int main() Rectangle myRectangle;FunctionOne(myRectangle);return 0;ptheCattheCat是是myCatmyCat的引用,不会引起构造及析构。的引用,不会引起构造及析构。p返回的临时引用是返回的临时引用是theCattheCat的引用,也就是对的引用,也就是对myCatmyCat的的 引用,不会引起构造与析构。引用,不会引起构造与析构。p传递引用不会创建新的对象,引用只是别名。传递引用不会创建新的
26、对象,引用只是别名。-60-61-62-63-p通过传入的通过传入的triketrike对象,创建和对象,创建和triketrike“相同相同”的新对象。的新对象。-64-65-66-class Tricyclepublic: Tricycle(); Tricycle(const Tricycle& rhs); Tricycle(); int getSpeed() const return *speed; void setSpeed(int newSpeed) *speed = newSpeed; void pedal(); void brake();private: int *spe
27、ed;-67-Tricycle:Tricycle() speed = new int; *speed = 5;Tricycle:Tricycle(const Tricycle& rhs) speed = new int; *speed = rhs.getSpeed(); /或:*speed = *rhs.speed;Tricycle:Tricycle() delete speed; speed = NULL;p构造函数中分配内存,析构函数中释构造函数中分配内存,析构函数中释 放内存。放内存。p默认复制构造函数中,不会分配内存默认复制构造函数中,不会分配内存 只是执行只是执行speed
28、= rhs.speedspeed = rhs.speed。-68-void Tricycle:pedal() setSpeed(getSpeed() + 1); /或(*speed) +; std:cout “ Pedaling getSpeed() “n;void Tricycle:brake() setSpeed(getSpeed() - 1); std:cout “ Pedaling getSpeed() “n;ppedalpedal中通过中通过setSpeedsetSpeed设置新速度,也可以直接修改数据设置新速度,也可以直接修改数据 * *speed += 1speed += 1,但
29、通过调用,但通过调用setSpeedsetSpeed可以隐藏实现细节。可以隐藏实现细节。p更进一步:更进一步:setSpeed ( getSpeed()+1 ); setSpeed ( getSpeed()+1 ); 不用关心不用关心speedspeed 到底是如何存储等实现细节。到底是如何存储等实现细节。-69-#include int main() Tricycle wichita; Tricycle dallas(wichita); wichita.setSpeed(10); std:coutWichita; wichita.pedal(); std:coutDallas; dallas.pedal(); std:coutWichita; wichita.brake(); std:coutDallas; dallas.brake(); return 0;p复制构造后,新创建的复制构造后,新创建的dallasdallas 和和wichitawichita的状态相同。的状态相同。 * *speedspeed都是都是5 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国柔性软管行业投资前景及策略咨询报告
- 2025至2030年中国板材脚套市场现状分析及前景预测报告
- 2025至2030年中国机车油压减振器数据监测研究报告
- 2025至2030年中国机动式弯折试验机行业投资前景及策略咨询报告
- 2025至2030年中国木塑线条数据监测研究报告
- 2025至2030年中国有粘结预应力钢绞线行业投资前景及策略咨询报告
- 2025至2030年中国智能试题库行业投资前景及策略咨询报告
- 2025至2030年中国智能化产品数据监测研究报告
- 2025至2030年中国普通仿蜡印花布行业投资前景及策略咨询报告002
- 2025至2030年中国日期印章市场分析及竞争策略研究报告001
- 铁粉销售合同
- 初中语文修改病句市公开课一等奖省赛课获奖课件
- 世界《结核病日》主题班会课件
- 高考数学微专题集专题6圆锥曲线硬解定理微点1圆锥曲线硬解定理(原卷版+解析)
- 信息技术设备维护承诺书
- 2023-2024学年安徽省A10联盟高一(下)期中数学试卷(含解析)
- 《钢管桁架预应力混凝土叠合板技术规程》0805
- 污水排入城镇污水管网排放口设置技术规范
- 流行音乐(中国)
- 缅怀先烈-感恩当下-主题班会
- 中医慢病与康复医联体信息化管理系统需求说明
评论
0/150
提交评论