书签 分享 收藏 举报 版权申诉 / 81
上传文档赚钱

类型C++大学基础教程第六章课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2941920
  • 上传时间:2022-06-13
  • 格式:PPT
  • 页数:81
  • 大小:967KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《C++大学基础教程第六章课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C+ 大学 基础教程 第六 课件
    资源描述:

    1、2022-6-312022-6-32指针(指针(PointerPointer)是)是C+C+和和C C的的一种数据类型。很多其他高级一种数据类型。很多其他高级语言也有类似的数据类型。语言也有类似的数据类型。引用(引用(ReferenceReference)则是)则是C+C+所所特有的一种数据类型。特有的一种数据类型。2022-6-336.1 指针的概念 6.2 指针的运算 6.3 指针和函数 6.4 指针和字符串 6.5 通过指针访问数组 6.6 指针访问动态内存6.7 引用概念 2022-6-342022-6-35 指针是变量的地址地址例如,定义整型变量a,a的地址就是 一个指针。直接指定内

    2、存某个地址开始(如 0 x00430100) 存放指针的变量就是指针变量。2022-6-36 当声明了一个指针变量后,确定了三件事:1. 变量本身在内存中所分配的地址和字节数(4个)2. 系统允许的地址范围,及地址单元内可以存放的内容3. 指针变量可以进行的运算 访问指针变量时,只能看到地址 通过这个地址访问地址单元中的内容,这样的访问称为对于内存单元的间接访问。2022-6-37 指针变量声明的格式是: 类型名 *变量名1, *变量名2; 例如: int *va1, *va2; char *ch1, *ch2; 指针变量在声明后,变量的值(地址)是随机的。这样的指针变量是不能安全的使用的20

    3、22-6-38 在声明指针变量时的“*”,有两个含义:声明变量va1、ch1、ch2都是指针变量;说明变量va1的类型是(int *)型,即指向整型变量的指针。ch1和ch2的类型是(char *)型 指针变量都是有类型的- 所指定的地址单元中存放的数据的类型 2022-6-39 指针变量必须初始化后才能安全使用 声明指针变量时进行初始化的格式: 类型名 *指针变量名=&变量名; char ch1=Y, ch2=A; char *pch1=&ch1, *pch2=&ch2;2022-6-310 赋值方式进行初始化: int i1=Y, i2=A; int *pi1, *pi2; pi1=&i1

    4、; pi2=&i2; 没有初始化的指针变量不可以使用 (编译系统会给出警告,而运行时会出现错误) 2022-6-3116.2 6.2 指针的运算指针的运算 2022-6-312 表6.1 指针的运算2022-6-313 指针的赋值: 地址的赋值地址的赋值 同类型变量的地址 同类型的已经初始化的指针变量; 其他同类型的指针 用0或者NULL赋值 “空指针”,即不指向任何的内存物理地址 不同类型的指针不可以互相赋值不同类型的指针不可以互相赋值在指针赋值时,不存在类型自动转换的机制2022-6-314 例6.1 观察以下指针赋值运算的结果。如果将注释去掉,结果将如何?#include using n

    5、amespace std;void main()int va1=100,*pva1; int *pva2=NULL; float vf1=A,*pvf1,*pvf2;coutvalue of pva2 is pva2endl; pva1=&va1; pvf1=pvf2=&vf1; coutpva1 &va1endl; coutpvf1 pvf2endl; /pvf1=pva1;value of pva2 is 0 x000000000 x0012FF7C 0 x0012FF7C0 x0012FF74 0 x0012FF74 注释去掉会出现编译错误注释去掉会出现编译错误2022-6-315 间接

    6、引用运算符“*” :一元运算符和指针变量连用,对指针所指向的内存地址单元进行间接访问 使用的格式: *指针变量 如果指针变量iptr指向整型变量va*iptr就是变量va的内容 2022-6-316 例6.2 对变量的直接访问和间接访问#include using namespace std; void main()char ch1=a,*ch; int k1=100; ch=&ch1; /指针ch指向变量ch1 cout*ch=*chendl;/间接访问 *ch=B; coutch1=ch1endl;/直接访问 ch1=k1; cout*ch=*chendl; /间接访问 运行结果运行结果:

    7、*ch=ach1=B*ch=d2022-6-317 例6.3 观察对这种指针变量间接访问的结果。#include using namespace std;void main() int va=100,*pva,*ppva; /ppva是指向指针的指针 int k1=100; pva=&va; cout*pva=*pvaendl; /间接访问结果是整型数 ppva=&pva; cout*ppva=*ppvaendl; /间接访问结果是地址 coutpva=pvaendl; /就是指针pva的内容运行结果运行结果:*pva=100*ppva=0 x0012FF7C pva=0 x0012FF7C

    8、2022-6-3182022-6-319可以进行的只有加法和减法加法和减法-和整数n做加法或者减法指针指针p p和整数和整数n n相相加加( (相减相减) )的含义的含义是指向当前指向是指向当前指向位置位置p p的前方或的前方或后方第后方第n n个数据个数据的地址。的地址。2022-6-320 例6.4 通过指针的间接访问,输出下标为偶数的数组元素的值。#include using namespace std;void main() int k110=11,24,37,44,58,66,79,86,93,108,*k; k=&k10; for(int i=0;i10;i=i+2) coutk1

    9、i=*(k+i) ; coutendl; 运行结果运行结果:K10=11 k12=37. 数组第一个元素(下标为数组第一个元素(下标为0)的地址赋值给指针)的地址赋值给指针k 每次循环,指针加每次循环,指针加2 22022-6-321 指针和指针的直接加法没有意义直接加法没有意义 指针和指针的减法可以减法可以进行-求出两个指针之间可以存放几个指定类型的数据 不允许用一个整数减一个指针 2022-6-322 同类型的指针可以可以进行关系运算 进行指针“大于”、“小于”的比较,是判定指针在内存中的相对位置 指针和一般的整数比较没有意义,也不允许惟一可以和指针比较的整数是0。判定指针是不是空指针 2

    10、022-6-323 void类型的指针就是“无类型”指针: void *指针名; 存放的也是内存的地址,但不指定这个地址单元内的数据的类型 2022-6-324-任何指针都可以赋值给void指针 赋值后的void指针的类型仍然是void -void指针不可以赋值给其他任何类型的指针 -void指针不可通过间接引用访问内存中数据 -必须进行指针类型的强制转换,才可以使用指针间接引用访问内存数据 2022-6-325 例6.5 使用memcpy通用复制函数复制数组原型 void *memcpy(void *dest, const void*, size) #include using namesp

    11、ace std; #include #include void main()void main() char src10=012345678; char src10=012345678; char dest10; char dest10; char char* * pc=(char pc=(char* *)memcpy(dest,src,10);)memcpy(dest,src,10); cout pc endl;cout pc endl; int s13=1,2,3; int s13=1,2,3; int d13; int d13; int int * *pi=(intpi=(int* *)

    12、memcpy(d1,s1,12);)memcpy(d1,s1,12); coutcout* *pi pi * *(pi+1) (pi+1) * *(pi+2)endl;(pi+2)endl; 运行结果运行结果:0123456780123456781 2 3 复制字符数据,复制字符数据,1010个个字节字节复制整型数据,复制整型数据,1212个个字节字节2022-6-326 void类型指针应用:显示字符指针的内容其他指针直接用cout语句输出地址值而字符指针输出的是字符串 将字符指针强制转换为void指针cout语句输出便是地址值例:char *pch=Hello C+; coutpchend

    13、l; cout(void*)pchendl; 2022-6-327 指针是地址int *p;p=&a;*p=100; b=*p+2;2022-6-3286.3 6.3 指针和函数指针和函数 2022-6-329 在程序设计中,指针有很多应用 其中之一就是作为函数的参数,形成了C+函数调用中的另一种调用方式:地址调用地址调用 2022-6-330 实现地址调用,必须满足以下条件: 函数的形式参数是指针变量形式参数是指针变量; 函数的实参数是内存的地址实参数是内存的地址(可以是数组名数组名、变量的地址变量的地址、用变量地址初始化的指针指针)形参指针类型和实参地址类型必须相同类型必须相同 2022-

    14、6-331实参传递给形参的是内存的地址,所以形参指针指向实参变量 形参指针通过间接引用,直接访问实参直接访问实参变量变量 (包括改变实参变量的值)函数调用后,改变了实参,如果有多个实参,就可以有多个实参变量在函数调用中被修改 2022-6-332 例6.6 编写数据交换的函数。#includevoid Swap(int void Swap(int * *a, int a, int * *b);b);void main()void main() int x(5), y(10);int x(5), y(10); coutcout主函数变量的值:主函数变量的值: x=x y=yendl;x=x y=

    15、yendl;Swap(&x,&y);Swap(&x,&y);coutcout返回后变量的值:返回后变量的值: x=x y=yendl;x=x y=yendl; void Swap(int void Swap(int * *a, int a, int * *b)b) int t;int t;t=t=* *a;a;* *a=a=* *b;b;* *b=t;b=t; cout cout函数中完成了交换:函数中完成了交换:* *a=a=* *a a * *b=b=* *bendl;bendl; 运行结果运行结果:主函数变量的值:主函数变量的值:x=5 y=10函数中完成了交换:函数中完成了交换:*a=

    16、10 *b=5返回后变量的值:返回后变量的值: x=10 y=5 变量的地址作为实参数变量的地址作为实参数指针变量作为形式参数指针变量作为形式参数2022-6-333 变量x和y的地址作实参传递给指针a和b,如图(a) 通过间接引用*a和*b进行交换,实际上就是x和y进行交换,如图(b) 2022-6-334 例6.7 指针变量指向一个数组 #includeusing namespace std;void Move(int void Move(int * *a);a);void main()void main() int x5=10,20,30,40,50, int x5=10,20,30,4

    17、0,50, * *px=x;px=x;coutcout调用前的调用前的* *px=px=* *pxendl;pxendl; Move(px);Move(px);coutcout调用后的调用后的px;px;if(px=x)coutif(px=x)cout没有变化,没有变化,* *pxpx还是还是* *pxendl;pxendl;else coutelse cout也向前移动,也向前移动,* *pxpx变为变为* *pxendl;pxendl; void Move(int void Move(int * *a)a) a=a+1; a=a+1; * *a=100;a=100; cout cout“函

    18、数中完成了指针函数中完成了指针移动:移动:* *a=a=* *aendl;aendl; 运行结果运行结果:调用前的调用前的*px=10 函数中完成了指针移动:函数中完成了指针移动:*a=20 调用后的调用后的pxpx没有变化没有变化*px还是还是10 指针作为实参数指针作为实参数指针变量作为形式参数指针变量作为形式参数2022-6-335 通过数组名地址调用,可以可以改变实参数组内容 但有时并不需要改变数组的值 例如,在调用一个求数组最大值的函数时,就不希望数组的值发生变化 希望在函数中能够限制对数组元素的修改 使用常指针可以达到这个目的 2022-6-336 常指针常指针是指向常量的指针(P

    19、ointer to Constant data) 规定指针所指向的内容不可以通过指针的规定指针所指向的内容不可以通过指针的间接引用来改变间接引用来改变。 常指针说明的格式是: const 类型名 *指针名; 例如: const int *ptint; 指针ptint的类型是(const int *),即指向一个恒定的整型数 2022-6-337 例6.10 常指针示例。观察以下程序的运行。 #include using namespace std;void main()void main()int ia=10, ib=20;int ia=10, ib=20;const int const in

    20、t * *ptint; ptint; ptint=&ia;ptint=&ia; / /用用ia ia地址初始化地址初始化coutcout* *ptintendl;ptintendl;ptint=&ib;ptint=&ib; / /改变为改变为ib ib的地址的地址ib=ib+100;ib=ib+100; /ib/ib本身仍然可以改变本身仍然可以改变coutcout* *ptintendl;ptintendl;/ / * *ptint=100;ptint=100; / /语句错误:左值是常量语句错误:左值是常量 运行结果运行结果:10 120 常指针声明常指针声明注释去掉会出现编译错误注释去掉会

    21、出现编译错误2022-6-338 指针常量指针常量(Pointer constant)指针本身是常量指针本身是常量(地址是常量地址是常量),不可以改变指针常量声明的格式: 类型名类型名 *const 指针名指针名=初值初值; char ch, *const ptch=&ch; 数组名是数组的首地址-数组名是指针常量 2022-6-339 例6.11 指针常量示例。指出以下程序的错误。 #include using namespace std;void main() int a=10, b=100; int int * *const pa=&a;const pa=&a;/pa是指针常量 cout

    22、*paendl; * *pa=20;pa=20; /指针常量的间接引用是允许的 coutaendl; pa=&b; const int c=50; int *const pc=&c; 错误语句注错误语句注释掉后运行释掉后运行结果结果:10 20 语句有错:常量不语句有错:常量不能当左值能当左值语句有错,地址语句有错,地址类型不同类型不同不能用常量地址不能用常量地址初始化指针常量初始化指针常量2022-6-340例6.12 用常指针作形参,函数printString可以输出数组的内容,不可以对数组修改。 #include using namespace std;void printString(

    23、 const char void printString( const char * * ); );void main()void main() char phrase = C+ is a programming language; char phrase = C+ is a programming language; cout The string is:n; cout The string is:n; printString( phrase ); cout endl; printString( phrase ); cout endl; / main / main函数结束函数结束void p

    24、rintString( const char void printString( const char * *Ptarray )Ptarray ) while( while(* *Ptarray) Ptarray) cout cout * *Ptarray+;Ptarray+; 不使用常指针也不使用常指针也是可以完成打印。是可以完成打印。但是没有保护了。但是没有保护了。数组名作实参数数组名作实参数常指针作形式参数常指针作形式参数2022-6-3416.4 6.4 指针和字符串指针和字符串 2022-6-342 字符串常量字符串常量:双引号括起,0结束 如:This is a string。 字

    25、符串常量有自己固定的首地址 如果将字符串常量的首地址看成是指针,这种指针既是常指针,也是指针常量。 2022-6-343 处理字符串两种方式:数组方式数组方式和指针方式指针方式 数组方式数组方式是将字符串存入字符数组: char string_array =Whats a nice day!; 指针方式指针方式是用字符串常量来初始化一个字符指针: char *string_pt=Whats a nice day!; 2022-6-344指针常量不能指针常量不能放在等式左边放在等式左边运行时会出运行时会出错错2022-6-345实参数:字符数组名、已经初始化的字符指针,字符串常量实参数:字符数组

    26、名、已经初始化的字符指针,字符串常量目的串必须是可写的。目的串必须是可写的。2022-6-346 例6.14 strcpy和strncpy的比较。 #include #include void main()void main() int n; int n; char char * *array1 = Happy Birthday to You;array1 = Happy Birthday to You; char array3 15 ; char array2 25 ; char array3 15 ; char array2 25 ; strcpy( array2, array1 ); s

    27、trcpy( array2, array1 ); cout The string in array1 is: array1 cout The string in array1 is: array1 nThe string in array2 is: array2 n; nThe string in array2 is: array2 n; / /* *strcpy(array3,array1); strcpy(array3,array1); coutarray3endl; coutarray3endl; * */ / n=sizeof(array3); n=sizeof(array3); st

    28、rncpy( array3, array1, n-1 ); / strncpy( array3, array1, n-1 ); /复制复制array1array1的的n-1n-1个字符个字符 array3 14 = 0; / array3 14 = 0; / 添加添加0 0 到到array3array3 cout The string in array3 is: array3 endl; cout The string in array3 is: array3 endl; 不包括提示的运行结果不包括提示的运行结果Happy Birthday to YouHappy Birthday to Yo

    29、uHappy Birthday 复制复制array1array1到到array2array2,没有问题没有问题复制复制array1array1到到array3array3,空间不够,空间不够,有运行错误有运行错误按实际数组大小,复制按实际数组大小,复制array1array1到到array3array3,没有问题没有问题2022-6-3476.5 6.5 通过指针访问数组通过指针访问数组 2022-6-348 指针和数组有天然的联系数组名就是地址数组名就是地址,也就是某种类型的指针 虽然一维数组名和二维数组名都是地址,都可以看作是某种指针,但是指针的类型是不同的通过指针访问一维数组和二维数组的

    30、方法是不同的 2022-6-349必须声明和数组类型相同的指针,并用数组名初始化指针: int A10, *pa=A; 多种方式访问数组元素多种方式访问数组元素1. 数组名和下标,如A0、A4 2. 指针和下标,如pa0、pa4 3. 指针加偏移量的间接引用,如*(pa+4)4. 数组名加偏移量的间接引用,如*(A+4)5. 指针自加后的间接引用,如*pa+ 2022-6-350例6.15 求数组内所存放的字符串的长度 void main() char ChArray=This is a string.,char ChArray=This is a string.,* *ptch;ptch;

    31、int i,j,k,offset1,offset2; int i,j,k,offset1,offset2; ptch=ChArray; ptch=ChArray;/ /指针初始化指针初始化 for(i=0;for(i=0;ChArrayiChArrayi!=0;i+);!=0;i+); coutThe length of the string is:iendl; coutThe length of the string is:iendl; for(j=0; for(j=0;ptchjptchj!=0;j+);!=0;j+); coutThe length of the string is:je

    32、ndl; coutThe length of the string is:jendl; for(offset1=0; for(offset1=0;* *(ChArray+offset1)(ChArray+offset1)!=0;offset1+);!=0;offset1+); coutThe length of the string is:offset1endl; coutThe length of the string is:offset1endl; for(offset2=0;for(offset2=0;* *(ptch+offset2)(ptch+offset2)!=0;offset2+

    33、);!=0;offset2+); coutThe length of the string is:offset2endl; coutThe length of the string is:offset2endl; for(k=0;for(k=0;* *ptch+ptch+!=0;k+);!=0;k+); coutThe length of the string is:kendl; coutThe length of the string is:kendl; 运行结果都相同运行结果都相同方式方式1 1数组名下标数组名下标方式方式2 2:指针和下标:指针和下标方式方式3 3: 数组名加数组名加偏移

    34、量的间接引用偏移量的间接引用方式方式4 4:指针加偏:指针加偏移量的间接引用移量的间接引用方式方式5 5:指针自加的间接引用:指针自加的间接引用2022-6-351例6.16求整型数组的平均值,显示数组元素和平均值。 void main() void main() int intArray10=8,11,23,34,45,56,65,78,86,97, int intArray10=8,11,23,34,45,56,65,78,86,97,* *ptint;ptint; int i,num,sum; float average; int i,num,sum; float average; pt

    35、int=intArray; ptint=intArray; sum=0;sum=0; num=sizeof(intArray)/sizeof( num=sizeof(intArray)/sizeof(* *intArray); intArray); for(i=0;inum;i+)for(i=0;inum;i+) sum=sum+ sum=sum+* *ptint+;ptint+; average=(float)sum/num; average=(float)sum/num; ptint=intArray; ptint=intArray; coutcout数组元素是:数组元素是: n;n; f

    36、or(i=0;inum;i+) for(i=0;inum;i+) cout cout* *ptint+ ;ptint+ ; cout cout“nn平均值是:平均值是:” ” averageendl;averageendl; 运行结果:运行结果:数组元素是:数组元素是:8 11 23 34 45 56 65 8 11 23 34 45 56 65 78 86 9778 86 97平均值是:平均值是:50.3 指针初始化指针初始化求数组元素求数组元素的数目的数目求平均值求平均值指针再次初始化指针再次初始化输出数组元输出数组元素和它们的素和它们的平均值平均值2022-6-352 二维数组可以看成是

    37、一维数组的一维数组 二维数组名也是地址(指针),但和一维数组名有不同的类型 对一维数组A5数组名A的地址,是第一个元素A0的地址指针的类型是指向数组元素的指针A+1 A1的地址 2022-6-353 对二维数组B34数组名B的地址,一维数组B0的地址指针的类型是指向一维数组的指针指针的类型是指向一维数组的指针B+1 一维数组B1的地址 2022-6-354 定义指向一维数组的指针时,必须指出一维数组的大小 声明格式如下: 类型名 (*指针变量名)一维数组大小; 例如: char (*ptchb)4, (*ptchc)2; ptchb=B; ptchc=C; 2022-6-355指向一维数组的指

    38、针具有的特征: 二维数组名是指向一维数组的指针,不指向数组元素 指针加1 是指向下一个一维数组的指针 指向一维数组的指针的间接引用的结果仍然是地址,即*ptchb仍然是地址,为一维数组B0第一个元素B00的地址 *ptchb是数组元素的地址,*ptchb就是数组元素的值访问二维数组第i行第j列元素: *(*(指针名+i)+j) 2022-6-356例6.17比较指向一维数组的指针和指向数组元素的指针 void main() short B34, C32; short (*ptshb)4, (*ptshc)2; ptshb=B; ptchc=C; cout比较不同的指向一维数组指针的差别n; c

    39、outptshb的地址是: ptshbn; coutptshb+1的地址是:ptshb+1n; coutptchc的地址是: ptshcn; coutptchc+1的地址是:ptshc+1n;比较不同的指向一维数组指针的差别比较不同的指向一维数组指针的差别ptshbptshb的地址是:的地址是: 0 0 x0012FF68x0012FF68ptchb+1ptchb+1的地址是:的地址是:0 0 x0012FF70 x0012FF70ptchcptchc的地址是:的地址是: 0 0 x0012FF5Cx0012FF5Cptchc+1ptchc+1的地址是:的地址是:0 0 x0012FF60 x

    40、0012FF60 B B的第的第0 0行地址行地址 B B的第的第1 1行地址行地址 C C的第的第0 0行地址行地址 C C的第的第1 1行地址行地址2022-6-357 cout不同类型的指针n; coutptshb的地址是:ptshbendl; cout*ptshb的地址是:*ptshbendl; cout*ptshb+1的地址是:*ptshb+1endl; coutB01的地址是: &B01endl; /cout“ptchb和*ptchb相等吗?” (ptchb=*ptchb)endl; /有语法错误,类型不同 cout*ptshb+1和&B01相等吗?; if(*ptshb+1=&B

    41、01) coutYesendl; 不同类型的指针不同类型的指针ptshbptshb的地址是:的地址是: 0 0 x0012FF68x0012FF68* *ptshbptshb的地址是:的地址是: 0 0 x0012FF68x0012FF68* *ptshb+1ptshb+1的地址是:的地址是: 0 0 x0012FF6Ax0012FF6AB01B01的地址是:的地址是: 0 0 x0012FF6Ax0012FF6A* *ptshb+1ptshb+1和和& &B01B01相等吗?相等吗?YesYes B B的第的第0 0行地址行地址 B B的第的第0 0行第行第0 0列列 元素的地址元素的地址

    42、B B的第的第0 0行第行第1 1列列 元素的地址元素的地址 B B的第的第0 0行第行第1 1列列 元素的地址元素的地址2022-6-358例6.18 用单循环程序,求二维数组元素的平均值。 void main() int Array34int Array34=32,42,12,25,56,76,46,53,76,89,96,82, ( (* *pt)4;pt)4; int sum, j; float average; sum=0; pt=Array; pt=Array; j=sizeof(Array) / sizeof (*Array); for(int i=0;ij;i+) sum=su

    43、m+*(*pt+i); average=(float)sum/j; cout数据的平均值等于:averageendl; 运行结果:运行结果:数据的平均值等于数据的平均值等于57.083357.0833指向一维数组指针的初始化指向一维数组指针的初始化求数组元素的数目,求数组元素的数目,* * *ArrayArray就是元素就是元素Array00Array00数组求和数组求和求平均值求平均值输出平均值输出平均值2022-6-359一维数组:一维数组:int intArray2=8,11,int intArray2=8,11,* *ptint;ptint;sum=sum+sum=sum+* *pti

    44、nt+;ptint+;二维数组:二维数组:int A23int A23=32,42,12,25,56,76,( (* *pt)3;pt)3;sum=sum+sum=sum+* *( (* *(pt+i)+j);(pt+i)+j);2022-6-3606.6 6.6 指针访问动态内存指针访问动态内存2022-6-361 动态内存: 在程序执行时才可以申请、使用和释放的内存 存放动态数据的区域称为“堆”,动态内存也称为堆内存堆内存 动态内存不能通过变量名来使用,只能通过指针来使用 2022-6-362 C+中通过运算符new申请动态内存,运算符delete释放动态内存 new的使用格式: new

    45、类型名 (初值) int *p; p = new int(3); 申请成功: 返回指定类型内存的地址申请失败: 返回NULL指针2022-6-363 运算符delete释放动态内存 delete运算符使用格式: delete 指针名; delete p ; new 与delete 应该成对出现2022-6-364申请动态数组要加上数组的大小: 一维:一维: new 类型名常量表达式 ; 注意:动态申请数组空间时,不可以对数组进行初始化 二维:二维:int (*pi_marray)4;pi_marray = new int34; 释放动态数组空间都用相同的表达式: delete ; 2022-6

    46、-365 内存泄漏 动态申请的内存空间,没有正常释放,但也不能继续使用的情况。如: char *ch1;ch1 = new char(A);char *ch2 = new char;ch1=ch2; 原来为ch1所申请的存放字符A的空间就不能再使用了,产生了内存泄漏 2022-6-366指针指向一个已经释放的空间,即指针悬挂 char *ch1, *ch2;ch1 = new char;ch2 = ch1;*ch2 = B;delete ch1; 指针ch2指向了一个已经释放的地址空间-指针悬挂用用delete ch2;语句来释放语句来释放ch2所指向的空间,所指向的空间,会出现运行错误会出现

    47、运行错误2022-6-367 6.7 6.7 引用概念引用概念2022-6-368 引用(Reference)是C+中新引入的概念,是C语言中不存在的数据类型 引用是引用是变量或者其他编程实体(如对象)的别名别名 因此引用不可以单独定义如图6.4(a):变量A在内存中有自己的地址,而A的引用B实际上就是变量A,只是A的另外一个名字 2022-6-369 引用通过运算符&来定义:类型名 &引用名 = 变量名;变量名必须已经定义变量名必须已经定义和引用的类型必须相同和引用的类型必须相同 int someInt;int &refInt = someInt; 必须注意:引用必须在声明的时候就完成初始化

    48、,不可以先声明引用,然后再用另一个语句对它初始化。 2022-6-370 改进C中函数的形参定义为指针型参数时所带来的不安全性int add( int *x, int *y ) *x=*x+*y;return *x;int add( int &x, int &y ) x = x+y; return x;改为改为2022-6-371 引用的特点: 引用不能独立存在,它只是其他变量的别名 引用必须在声明的同时初始化 引用一旦定义,引用关系就不可以更改B是A的引用,就不可能是其他变量的引用 引用的类型就是相关的变量的类型,引用的使用和变量的使用相同 2022-6-372例6.22 引用的使用。观察以

    49、下程序的结果。 void main() int intA=10; int & refA=intA; cout“引用的值和相关变量值相同:refA=refAendl; refA=5; cout“引用的变化,则相关变量也变化:intA=intAendl; cout“引用的地址和相关变量地址相同:intA的地址&intAendl; cout“引用的地址和相关变量地址相同:refA的地址&refAendl;引用的值和相关变量值相同引用的值和相关变量值相同: :refA=10refA=10引用的变化,则相关变量也变化:引用的变化,则相关变量也变化:intA=5intA=5引用的地址和相关变量地址相同:引

    50、用的地址和相关变量地址相同:intAintA的地址的地址0 0 x0012FF7Cx0012FF7C引用的地址和相关变量地址相同:引用的地址和相关变量地址相同:refArefA的地址的地址0 0 x0012FF7Cx0012FF7C2022-6-373例6.23 指针的引用。 void main() int intA=10,intB=20; int *pti=&intA; int *&refi=pti; cout“指 针 的 引 用 可 以 访 问 指 针 所 指 的 变量:*refi=*refiendl; cout指针变量原来的值:pti=ptiendl; refi=&intB; cout“

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:C++大学基础教程第六章课件.ppt
    链接地址:https://www.163wenku.com/p-2941920.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库