收藏 分销(赏)

西南交通大学-戴克俭-c-第五章.ppt

上传人:精**** 文档编号:2695093 上传时间:2024-06-04 格式:PPT 页数:78 大小:1.78MB
下载 相关 举报
西南交通大学-戴克俭-c-第五章.ppt_第1页
第1页 / 共78页
西南交通大学-戴克俭-c-第五章.ppt_第2页
第2页 / 共78页
西南交通大学-戴克俭-c-第五章.ppt_第3页
第3页 / 共78页
西南交通大学-戴克俭-c-第五章.ppt_第4页
第4页 / 共78页
西南交通大学-戴克俭-c-第五章.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

1、西南交通大学戴克俭c第五章第五章 指针的应用教学目标:1着重介绍指针与指针变量的概念;2指针类型变量的定义、赋值以及引用的方法;3指针与地址运算符;4通过指针类型的变量去访问单一变量;5通过指针类型的变量去操作一维数组;6通过指针类型的变量去操作二维数组;7动态存储分配的概念及应用。2 2第五章 指针的应用教学内容:1掌握地址和指针的概念2掌握指针类型变量的定义、赋值以及引用的方法3掌握将一个变量或数组的地址赋给指针类型的变量4掌握指针操作相关的运算符;5掌握通过指针类型的变量去访问单一变量;6掌握通过指针类型的变量去操作一维数组;7理解通过指针类型的变量去操作二维数组;8理解动态存储分配的概

2、念及应用。3 35.1 指针的概述例5.1.1阅读如下程序:源程序清单:#includeusingnamespacestd;voidmain()inta;int*p;a=10;p=&a;4 45.1 指针的概述couta的值表示方法1:aendl;couta的值表示方法2:*pendl;couta的地址表示方法1:&aendl;couta的地址表示方法2:pendl;编程技巧:在源程序清单中,我们可以看到在操作变量a时,用了不同的两种方法,一种就是用我们很习惯的变量名的方式操作,另一种就是本章要学习的新概念指针的方式操作。5 55.1 指针的概述1指针是C+从C中继承过来的重要的概念,它提供了

3、一种较为直观的地址操作的手段。正确地使用指针,可以方便、灵活而有效地组织和表示复杂的数据结构。2利用指针可以进行动态内存分配和管理,可以更灵活地使用内存空间。3为了理解指针,要先理解关于内存地址的概念。计算机的内存储器就像一个巨大的一维数组,每个数组元素就是一个存储单元。就像数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,这个编号就称为内存单元的地址。在微型计算机,地址编码的基本单位是字节,每个字节是一个基本内存单元。6 65.1 指针的概述4 4在运行一个程序时在运行一个程序时,程序本身及其所用到的数据都程序本身及其所用到的数据都要放在内存储器中。程序、函数、变量、常数、数组要放

4、在内存储器中。程序、函数、变量、常数、数组和对象等和对象等,在内存储器中都要占有一席之地。存放在在内存储器中都要占有一席之地。存放在内存储器中的程序和数据都有一个地址内存储器中的程序和数据都有一个地址,用它们占用用它们占用的那片存储单元中的第一个存储单元的地址表示。的那片存储单元中的第一个存储单元的地址表示。5 5在在C+C+中,为某个变量、函数常数、数组和对象中,为某个变量、函数常数、数组和对象等分配内存储器的工作由编译程序完成。计算机通过等分配内存储器的工作由编译程序完成。计算机通过这种地址编号的方式来管理内存数据读写的准确定位。这种地址编号的方式来管理内存数据读写的准确定位。程序中声明的

5、变量是要占据一定的内存空间的,不同程序中声明的变量是要占据一定的内存空间的,不同的数据类型占用的字节数是不一样的,例如:的数据类型占用的字节数是不一样的,例如:charchar型型占占1 1个字节,个字节,shortshort型占型占2 2个字节,个字节,intint型和型和longlong型都占型都占4 4个字节。如图个字节。如图5-15-1所示,表明了每一个内存单元都有所示,表明了每一个内存单元都有自己的地址,在地址所标志的内存单元中可用来存放自己的地址,在地址所标志的内存单元中可用来存放数据,一般称为内存单元的内容。数据,一般称为内存单元的内容。7 75.1 指针的概述内存单元内存单元内

6、存单元内存单元内存单元内存单元2000200120023000地址编号地址编号内存储器内存储器363004内存单元内存单元的地址的地址内存单元内存单元的内容的内容int i=3;int j=6;8 86在C+程序中是如何从内存单元中存取数据的呢(1)是通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。例如:例5.1.1中,用语句:couta的值表示方法1:aendl;来输出变量a的值。5.1 指针的概述9 9(2)是通过地址

7、,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。例如:例5.1.1中,用语句:couta的值表示方法2:*pendl;来输出变量a的值。(3)有时使用变量名不够方便或者根本没有变量可用,这时就需要直接用地址来访问内存单元。例如,在不同的函数之间传送大量数据时,如果不是传递变量值,而是只传递变量的地址,就会减小开销,提高效率。如果是动态分配的内存单元,则根本就没有名称,这时只能通过地址访问。5.1 指针的概述10105.1 指针的概述1如何通过地址来操作呢?在C+中专门用一种数据类型,称为“指针”数据类型来表示“地址”,指针实

8、际上是某个内存单元的首地址。一个变量在内存空间中占用的地址就称为该变量的“指针”。2程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元,即都有地址。C+规定:1111(1)变量的地址可以用&表示。例如,&i表示变量i的地址。(2)数组的地址,即数组第一个元素的地址,可以直接用数组名表示。例如,a或&a0。(3)函数的地址用函数名表示。(关于函数的概念将在下一章学习)5.1 指针的概述12121如何使用指针呢?(1)由于指针是一种数据类型,是包含另一个变量地址的变量,指针也是一个变量,应遵循先定义,后使用。(2)定义指针类型是由该指针指向的变量类型决定。定义指针变量的

9、一般格式如下:定义语句中的“*”表示该变量为指针变量。5.2 指针变量的定义、赋值及使用存储类型存储类型 数据类型数据类型 *指针变量指针变量1313数据类型标识符规定了指针变量指向的数据类型例如:例5.1.1中,定义语句:int*p;“*”表示该变量p为指针变量;且指针变量p只能操作整型数据。5.2 指针变量的定义、赋值及使用14142指针变量的初始化的常用形式:与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。(1)指针变量的初始化常用的第一种形式:在定义指针变

10、量的同时进行初始化赋值,一般格式如下:数据类型*指针名初始地址;5.2 指针变量的定义、赋值及使用1515例如:inta=3;int*pa=&a;(2)指针变量的初始化常用的第二种形式:定义指针变量后,用赋值语句将其初始化。指针变量名=地址;可以是变量的地址、数组名、函数名等。例如:先定义:int*p;再用赋值语句:p=&x;5.2 指针变量的定义、赋值及使用1616(3)使用时注意事项:指针的类型是它所指向变量的类型。已赋初值的指针可以初始化另一个指针变量。例如:q=p;由于p已经有值,可以来初始化q。用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。例如:例5.3.1中,inta

11、=3;int*pa=&a;intx;int*p;p=&x;变量的定义一定要在指针定义之前。5.2 指针变量的定义、赋值及使用1717不能把常量或表达式的地址赋给指针变量。例如:P=&67;P=&(i+5)是非法的。不能将一个非0整数直接赋给指针变量,但可以赋整数值0,表示该指针为空指针。例如:int*p;p=0;p为空指针,不指向任何地址。允许声明指向void类型的指针,该指针可以被赋予任何类型对象的地址。例如:void*general;int*point;inti;general=&i;point=(int*)general;5.2 指针变量的定义、赋值及使用18183使用时要注意指针与指针

12、变量的区别:指针是内存单元的地址,简称地址。指针变量是用于存储变量地址的变量。5.2 指针变量的定义、赋值及使用19191为了使用指针变量,要掌握两个运算符:(1)指针运算符*,也称为“间接访问”运算符,是一个一元运算符,表示指针变量所指向的变量的值。(2)取地址运算符&,是一个一元运算符,用来得到一个对象的地址,例:&x,取变量x的地址。取地址运算符的操作数必须是变量名。2使用指针变量与使用一般变量一样,一定要先定义后使用,使用前,指针变量一定要有明确的指向,例如,int*p;,p=&x;明确指向变量x的地址。5.2 指针变量的定义、赋值及使用20205.3 通过指针变量访问单一变量 例例5

13、.5.15.5.1阅读如下程序:阅读如下程序:源程序清单:源程序清单:#include#includeusingnamespacestd;usingnamespacestd;voidmain()voidmain()intx,*p;intx,*p;x=3;x=3;p=&x;p=&x;*p=*p+10;*p=*p+10;cout*pendl;cout*pendl;21215.3 通过指针变量访问单一变量编程技巧:1程序中定义指针变量p,它的数据类型与它要操作的变量的数据类型一致,例5.5.1中同为int。2定义好指针变量p后,用赋值语句p=&x;将它要操作的变量的地址赋给了指针变量p。3用间接访问

14、*p,替代变量名来操作变量,例5.5.1中*p=*p+10;在原来的值3基础上加上10,与语句x=x+10;等价。4用*p输出值,即输出值为13。22225注意事项:(1)*出现在定义语句中和执行语句中其含义是不同的例如:例5.5.1中,intx,*p;在该语句中,*p是一个int型指针,*在定义语句中,表示定义的是指针变量cout*p;在该语句中,*p是输出指针p的内容,*在执行语句表示指针所指对象的内容。(2)p=&x;将变量x的地址赋给指针变量p,一定要先定义x,然后才能将变量x的地址赋给指针变量p,p有明确的指向后才能操作。5.3 通过指针变量访问单一变量2323 例例5.5.25.5

15、.2输入输入a a和和b b两个整数,运用指针技术按先大后两个整数,运用指针技术按先大后小的顺序输出小的顺序输出a a和和b b。思路分析:输入两个整数,判断谁大谁小,若思路分析:输入两个整数,判断谁大谁小,若a a大输大输出出a a,b b;若;若a a小输出小输出b b,a a。算法描述:算法描述:5.3 通过指针变量访问单一变量输出输出*p1、*p2的值的值输出输出*p2、*p1的值的值 *p1*p2Y N用指针操作方式从键盘获取输入两个整数的值用指针操作方式从键盘获取输入两个整数的值定义两个整型变量,及操作它们的两个整型指针,定义两个整型变量,及操作它们的两个整型指针,并把两个整型变量

16、的地址分别赋给两个整型指针并把两个整型变量的地址分别赋给两个整型指针2424源程序清单:源程序清单:#include#include#include#includeusingnamespacestd;usingnamespacestd;voidmain(void)voidmain(void)inta,b;inta,b;int*p1=&a;int*p1=&a;int*p2=&b;int*p2=&b;coutinputaandb:endl;coutinputaandb:*p1*p2;cin*p1*p2;5.3 通过指针变量访问单一变量2525if(*p1*p2)cout按先大后小的顺序输出的a和b

17、为:*p2setw(4)*p1endl;elsecout按先大后小的顺序输出的a和b为:*p1setw(4)*p2endl;编程技巧:1利用间接访问方式来操作。5.3 通过指针变量访问单一变量26265.4 通过指针变量操作一维数组在C+中,有了指针和地址的概念,我们在操作数组时,就可以用如下的四种方法来操作数组。使用数组名和下标使用数组名和下标使用数组名和指针运算使用数组名和指针运算使用指针变量使用指针变量使用下标表示法引用指针指向的数组元素使用下标表示法引用指针指向的数组元素例5.6.1设有一个int型数组a,有10个元素,请用上述的四种方法去访问数组的各个元素。2727源程序清单:#in

18、cludeusingnamespacestd;voidmain()inta10;inti,*p;for(i=0;iai;/数组名和下标来访问数组5.4 通过指针变量操作一维数组2828for(i=0;i10;i+)cout*(a+i);/数组名和指针运算来访问数组for(p=a;p-a10;p+)cout*p;/指针变量的移动来访问数组p=a;for(i=0;i10;i+)coutpi;/下标表示法5.4 通过指针变量操作一维数组2929编程技巧:编程技巧:1 1例中第一种方法操作数组时,使用数组名和下标例中第一种方法操作数组时,使用数组名和下标来访问数组,是第四章中我们已经学习和掌握的方法。

19、来访问数组,是第四章中我们已经学习和掌握的方法。2 2例中第二种方法操作数组时,使用数组名和指针例中第二种方法操作数组时,使用数组名和指针运算来访问数组,利用了数组名运算来访问数组,利用了数组名a a是数组首地址,是是数组首地址,是一个地址常量,是数组第一个元素的地址,但数组名一个地址常量,是数组第一个元素的地址,但数组名所代表的首地址只是一个指针常量,是固定的指针,所代表的首地址只是一个指针常量,是固定的指针,我们不能对数组名赋予一个新的地址值,也不能使这我们不能对数组名赋予一个新的地址值,也不能使这指针常量指针常量“移动移动”,指向数组的其它元素,要指向其,指向数组的其它元素,要指向其它数

20、组元素时,通过首地址加上一个值,使之指向其它数组元素时,通过首地址加上一个值,使之指向其它的数组元素。例如:它的数组元素。例如:例例5.6.15.6.1中就通过中就通过*(a+i)(a+i)来指来指向数组中的第向数组中的第i i个元素。个元素。5.4 通过指针变量操作一维数组30303例中第三种方法操作数组时,使用指针变量来访问数组,是利用指针变量可以赋新的地址值和使指针变量“移动”而指向数组的其它元素。4例中第四种方法操作数组时,使用下标表示法引用指针指向的数组元素,注意操作时,指针要指向数组的首地址。5.4 通过指针变量操作一维数组31311要使用指针变量来访问数组,关键是如何“移动”指针

21、变量,使指针变量指向具体要操作地数组元素的地址,就需要掌握指针变量的算术运算。指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。指针加一,减一运算指向下一个或前一个数据。例如:y=*px+相当于y=*(px+)*和+优先级相同,自右向左结合5.4 通过指针变量操作一维数组3232如:inta5=1,2,3,4,5;int*p;p=a;p+;p+=3;p-;指针变量值每自增一次指向后一个数组元素的内存单元指针变量值每自减一次指向前一个数组元素的内存单元6.8 指针的算术运算pa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(p

22、a+2)*(pa+3)*(pa-1)short*papa3333两指针相减:两指针相减的结果是一个整数,等于两指针指向的内存单元之间的内存单元的个数减1。例如:inta10,*p,*q,k;p=a;q=a+10;k=q-p;/k的值等于95.4 通过指针变量操作一维数组3434 例例5.6.35.6.3阅读如下程序:阅读如下程序:源程序清单:源程序清单:#include#includeusingnamespacestd;usingnamespacestd;voidmain()voidmain()chara10=abcdefghi;chara10=abcdefghi;char*p1,*p2;ch

23、ar*p1,*p2;p1=a;p1=a;p1+=2;p1+=2;p2=a+4;/p2=a+4;/指针变量指针变量p2p2,直接由数组名加上,直接由数组名加上4 4,指向数组指向数组的第五个数组元素的内存单元的第五个数组元素的内存单元5.4 通过指针变量操作一维数组3535if(p1p2)if(p1p2)cout“p1cout“p1所指向的数组元素在所指向的数组元素在p2p2所指向的数组所指向的数组元素前元素前面!面!endl;endl;elseelsecout“p1cout“p1所指向的数组元素在所指向的数组元素在p2p2所指向的数组所指向的数组元素后元素后面!面!endl;endl;p1+;

24、p2-;p1+;p2-;if(p1=p2)if(p1=p2)cout“p1cout“p1和和p2p2同时指向数组中的同一个元素且同时指向数组中的同一个元素且元素值元素值为:为:*p1endl;*p1endl;elseelsecoutp1coutp1和和p2p2没有指向数组中的同一个元素没有指向数组中的同一个元素!endl;endl;5.4 通过指针变量操作一维数组3636编程技巧:编程技巧:1 1在操作数组时,有时可能会用到两个指针变量指在操作数组时,有时可能会用到两个指针变量指向同一个数组,例如:在向同一个数组,例如:在 例例5.6.35.6.3中,用中,用p1p1和和p2p2两个两个指针变

25、量指向同一个数组,此时两个指针变量之间的指针变量指向同一个数组,此时两个指针变量之间的可以进行关系运算,其关系运算的结果表明了这两个可以进行关系运算,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系。指针变量所指向的数组元素的先后关系。(1)(1)若若p1=p2p1=p2;表明;表明p1p1和和p2p2指向数组中的同一个数组指向数组中的同一个数组元素;元素;(2)(2)若若p1p2p1p2p1p2;表明;表明p1p1所指向的数组元素在所指向的数组元素在p2p2所指向的所指向的数组元素后面。数组元素后面。例如:例如:5.4 通过指针变量操作一维数组3737例5.6.3中,第一次输出

26、时,p1p2条件成立,表明p1所指向的数组元素在p2所指向的数组元素前面;如图5-3所示。5.4 通过指针变量操作一维数组3838第二次输出时,p1=p2条件成立,表明p1和p2指向数组中的同一个数组元素,如图5-4所示。2此外,指针变量还可以和零之间进行等于或不等于的关系运算。例如:p=0或p!=0。5.4 通过指针变量操作一维数组3939指针应用举例 例例5.6.45.6.4利用指针技术,将键盘输入的利用指针技术,将键盘输入的N N个整数按相反个整数按相反的顺序存放并输出。的顺序存放并输出。思路分析:分别取出数组最前面和最后面的元素,进思路分析:分别取出数组最前面和最后面的元素,进行交换,

27、即行交换,即a0a0与与aN-1aN-1交换;然后再分别取出交换;然后再分别取出a1a1与与aN-2aN-2交换;直到交换完毕。交换;直到交换完毕。算法描述:算法描述:for(i=0,j=N-1;ij;i+,j-)定义、输入初始数组的值定义、输入初始数组的值指针指向数组的首地址指针指向数组的首地址temp=*(p+i)*(p+i)=*(p+j)*(p+j)=temp输出交换后数组的值输出交换后数组的值4040源程序清单:#include#includeusingnamespacestd;intmain(void)inta10,i,j,temp,*p;coutInputteninterger:e

28、ndl;for(p=a;p*p;指针应用举例4141指针应用举例 p=a;for(i=0,j=10-1;ij;i+,j-)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;for(p=a;pa+10;p+)coutsetw(4)*p;coutendl;return 0;4242指针应用举例编程技巧:1定义指针变量操作一维数组,定义后把指针变量指向数组的首地址,用循环输入各个数组元素的值。2再次使用指针变量操作数组前,必须要明确指针变量的指向,即指针变量再次指向数组的首地址,用语句“p=a;”实现。3利用了两个变量i,j并赋初值后,用*(p+i)、*(p+j)分别取出数

29、组中首尾元素的值进行交换,然后使i+、j-分别再取出数组中第二个元素的值和倒数第二个元素的值进行交换,直到交换完毕,即条件ij不成立。4343例5.6.5把一个整数插入到一个由小到大的有序数列中,并仍然保持由小到大的顺序。思路分析:设有10个整数按由小到大的顺序存放在a数组中,待插入的数存放在变量x中,如:10个有序数依次为:2468121617203040,待插入的数:x=11。要插入的数8x=11ap&pap&p10)p10p*(t+p)&p=a+p 成立成立 *(t+1)=*t t-t=a+p;指针指向要插入的位置;指针指向要插入的位置 *t=x;插入值;插入值 输出插入完成后的数组输出

30、插入完成后的数组4646指针应用举例#include#include#include#includeusingnamespacestd;usingnamespacestd;voidmain(void)voidmain(void)constintN=10;constintN=10;intaN+1,p=0,x,*tintaN+1,p=0,x,*t;cout“cout“输入输入a a数组:数组:”endlendl;for(t=afor(t=a;ta+Nt*tcin*t;cout“cout“输入待插入的数输入待插入的数x x:”endlxcinx;4747指针应用举例t=a;while(x*(t+p)

31、&p=a+p;t-)*(t+1)=*t;t=a+p;*t=x;for(t=a;t=a+N;t+)coutsetw(3)*t;4848指针应用举例编程技巧:1在定义数组时,要考虑到插入后数组元素的长度增加了一个,定义时要在原数组长度的基础上加一。例如:例5.6.5中,定义数组为:intaN+1。2要注意指针变量在使用后的指向,再次操作时要赋初值,例如:例5.6.5中,t=a;让指针变量再次指向数组的首地址。4949例5.6.6编写程序,用指针技术删除字符串末尾的所有空格。思路分析:用指针操作字符串,首先把指针指向字符串末尾的字符,取出其末尾字符的值,进行判断是否等于空格,若等于就删除,即把指针指

32、向前一个字符,指针减1,再取出倒数第二个字符进行判断是否等于空格,等于就进行同样的操作,直到不等于,就说明字符串末尾已经没有空格,操作完成,需要给字符串末尾加上结束标志0。指针应用举例5050指针应用举例定义定义string s1表示字符串,定义表示字符串,定义char型指针变量型指针变量*p操作操作字符串,定义操作中用到的变量字符串,定义操作中用到的变量n,j 输入含有末尾空格的字符串输入含有末尾空格的字符串 找到末尾字符:找到末尾字符:n=s1.size();j=n-1;指针变量指针变量*p赋初值:赋初值:p=&s10;当当 while(*(p+j)=空格空格)j-;加字符串结束标志加字符

33、串结束标志“0”输出删除末尾空格后的字符串输出删除末尾空格后的字符串5151源程序清单:源程序清单:#include#include#include#includeusingnamespacestd;usingnamespacestd;voidmain(void)voidmain(void)intn,j;intn,j;strings1=;strings1=;char*p;char*p;coutcout输入需要删除末尾空格的字符串输入需要删除末尾空格的字符串:endl;:endl;getline(cin,s1);getline(cin,s1);coutcout未删除末尾空格前的字符串为未删除末尾

34、空格前的字符串为:endls1:endls1字符串结束标志!字符串结束标志!endl;endl;n=s1.size();n=s1.size();指针应用举例5252指针应用举例j=n-1;j=n-1;p=&s10;p=&s10;while(*(p+j)=)j-;while(*(p+j)=)j-;*(p+j+1)=0;*(p+j+1)=0;coutcout删除末尾空格后的字符串为删除末尾空格后的字符串为:endls1:endls1 字符串结束标志!字符串结束标志!endl;endl;编程技巧:编程技巧:1 1用用stringstring数据类型,加头文件数据类型,加头文件#include#inc

35、lude。2 2由于输入字符串含有空格,输入时必须用由于输入字符串含有空格,输入时必须用getline(cin,s1)getline(cin,s1)函数实现输入。函数实现输入。3 3用用s1.size()s1.size()函数求出字符串的长度函数求出字符串的长度n n,包含字符串的,包含字符串的实际长度,字符数组是从下标实际长度,字符数组是从下标0 0开始,最后一个字符的开始,最后一个字符的位置应为位置应为n-1n-1。4 4用语句:用语句:p=&s10p=&s10对指针变量进行赋初值。对指针变量进行赋初值。5353应用举例例6-1从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其

36、交集。源程序清单如下:#include#includevoidmain(void)constintM=20,N=10;intaM,bN,cM;intd,e,f=0,*pa,*pb,*pc;cout输入数组a中元素的个数:d;5454cout输入数组a的d个元素:endl;for(pa=a;pa*pa;cout输入数组b中元素的个数:e;cout输入数组b的e个元素:endl;for(pb=b;pb*pb;for(pa=a,pc=c;paa+d;pa+)for(pb=b;pbb+e;pb+)应用举例5555if(*pa=*pb)*pc+=*pa;f+;break;cout交集c的各个元素依次为:

37、endl;for(pc=c;pcc+f;pc+)coutsetw(3)*pc;应用举例5656例6-2从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其并集。源程序清单如下:#include#includevoidmain(void)constintM=20,N=10;intaM,bN,cM+N;intd,e,f=0,*pa,*pb,*pc;应用举例5757cout输入数组a中元素的个数:d;cout输入数组a的d个元素:endl;for(pa=a;pa*pa;cout输入数组b中元素的个数:e;cout输入数组b的e个元素:endl;for(pb=b;pb*pb;应用举例5858

38、for(pa=a,pc=c;paa+d;pa+,pc+)*pc=*pa;f+;for(pb=b;pbb+e;pb+)for(pa=a;pa=a+d)*pc+=*pb;f+;cout交集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)*pc;应用举例59595.5 二维数组与指针例5.12 运用指针的方法编程实现:输出如下二维数组各元素的值。int a34=1,2,3,4,5,6,7,8,9,10,11,12 源程序清单一:#include#includeusingnamespacestd;voidmain()inta34=1,2,3,4,5,6,7,8

39、,9,10,11,126060int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)coutendl;coutsetw(4)*p;coutendl;5.5 二维数组与指针6161源程序清单二:#include#includeusingnamespacestd;voidmain(void)inta34=1,2,3,4,5,6,7,8,9,10,11,12;int*p3,i,j;for(i=0;i3;i+)pi=ai;5.5 二维数组与指针6262for(j=0;j4;j+)coutsetw(4)*(pi+j);coutendl;编程技巧:通过前面的学习我们知道,二维数组在计

40、算机里实际上是转换成一维数组来存储的,是按行方式存放的。5.5 二维数组与指针6363在操作二维数组时,指向二维数组的指针变量的定义、赋值和使用与指向一维数组的指针变量基本相同。具体操作二维数组时,一般常用两种方法:用指针变量使用数组元素,此方法是把二维数组用指针变量使用数组元素,此方法是把二维数组转换成一维数组来操作,定义指针变量先指向首地址,转换成一维数组来操作,定义指针变量先指向首地址,然后通过指针变量然后通过指针变量“移动移动”来操作具体的数组元素。来操作具体的数组元素。定义指针数组使用数组元素,指针数组就是数组定义指针数组使用数组元素,指针数组就是数组中每个元素是指针,用它来指向一维

41、数组。中每个元素是指针,用它来指向一维数组。5.5 二维数组与指针64645.13 利用指针技术,求55阶方阵主对角线的和。思路分析:55的方阵用二维数组a55表示,定义一个指针数组*p5来操作数组;求主对角线的和,先找到主对角线上的元素,应满足条件行号等于列号,再进行累加。算法描述:5.5 二维数组与指针6565源程序清单:#includeusingnamespacestd;voidmain(void)inta55,*p5,i,j,sum=0;cout“请输入方阵的值:”endl;for(i=0;i5;i+)pi=ai;for(j=0;j*(pi+j);5.5 二维数组与指针6666for(

42、i=0;i5;i+)pi=ai;for(j=0;j5;j+)if(i=j)sum=sum+*(pi+j);cout“方阵的对角线之和为:”sumendl;5.5 二维数组与指针67676.10 存储分配静态存储分配:程序中,使用的变量和数组的类型、数目和大小是在编写程序时由程序员分配确定下来的,因此在程序运行时这些数据占据的存储空间数也是一定的。这种存储分配方法被称为静态存储分配。缺点:在程序运行时,无法根据具体情况灵活调整存储分配情况。动态存储分配:在程序运行过程中按照实际需要申请适量的内存单元,使用结束后还可以释放,这种存储分配方法被称为动态存储分配。6868运算符new的功能是动态分配内

43、存形式为:=new;或=new(初值);=new;为数组申请内存运算符delete用于释放先前申请到的内存单元形式为:delete;6.10 存储分配6969例int*ptr=newint(5);deleteptr;float*ptr=newfloat(2);例:#includeintmain()intx,*ptr=newint(5);inti;x=*ptr;coutx*ptrendl;6.10 存储分配7070deleteptr;ptr=newint10;for(i=0;i10;i+)*ptr=i;cout*ptrendl;ptr+;return0;6.10 存储分配71716.11 指针与

44、引用的区别引用是一种特殊类型的变量,可以被认为是另一个变量的别名。而指针是存储单元的地址。引用运算符“&”用来声明一个引用,在声明语句中。而指针中的地址运算符“&”用在执行语句中引用与指针二者截然不同。例:inti;int&refi=i;/refi是i的别名例:int*p,i=3;p=&i;/执行语句7272例1:引用作参数#includevoids&a,int&b);voidmain(void)intx(5),y(10);coutx=xy=yendl;s);coutx=xy=yendl;6.11 指针与引用的区别7373voids&a,int&b)intt;t=a;a=b;b=t;6.11 指针与引用的区别x与与a指向同一指向同一个存储单元个存储单元y与与b指向同一指向同一个存储单元个存储单元x a5y b10参数没有传递参数没有传递7474例2指针作参数#includevoids*a,int*b);voidmain(void)intx(5),y(10);coutx=xy=yendl;s);/地址运算符coutx=xy=yendl;6.11 指针与引用的区别7575voids*a,int*b)intt;t=*a;*a=*b;*b=t;6.11 指针与引用的区别x的地址的地址y的地址的地址abx(5)y(10)ab76767777资料整理仅供参考,用药方面谨遵医嘱

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 大学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服