您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++程序设计第7章-指针
第7章指针目的与要求7.1指针与指针变量7.2指针与数组7.3指针变量与数组作为函数参数(习题课)7.4指针数组和指向一维数组的指针变量7.5返回指针值的函数与函数指针变量7.6new和delete运算符7.7引用类型变量和const类型的指针本章小结目的与要求通过本章的学习,要求了解指针、指针变量、指针数组、指向一维数组的指针、返回指针值的函数、函数指针、引用类型变量的概念,掌握指针变量的定义格式及使用方法,重点掌握用指针变量处理有关变量、一维数组与字符串数组的问题。掌握用指针变量与数组作为函数参数时函数的使用方法。了解二维数组中有关行首地址、行地址与元素地址的概念,了解二维数组中元素的各种表示方式。初步学会指针数组、指向一维数组的指针、返回指针值的函数与函数指针的定义格式与简单使用方法。学会用new与delete运算符动态分配与回收内存空间的方法。掌握引用类型变量的定义与使用方法。7.1指针与指针变量7.1.1指针的概念(1)指针:系统为变量、数组、函数等分配内存的首地址称为指针。(2)指针变量:用于存放指针(内存首地址)的变量称为指针变量。7.1.2指针变量的定义与引用1.指针变量的定义〔存储类型〕类型*指针变量名1〔,*指针变量名2,…,*指针变量名n〕;2.指针变量的赋值(1)取地址运算符&:取出变量的内存首地址(2)指针变量的赋值:指针变量=&变量;或指针变量=指针变量;3.指针变量的引用指针运算符*:通过指针变量间接访问变量对应存储单元内容。【例7.1】定义指针变量p、p1、q,并将变量a的地址赋给p、p1,输出a、p、p1、*p、*p1的值。例程4.指针变量初始化例如:int*p=&a;指针变量p1000变量a1000100地址1000指针变量p10指针变量q指针变量7.1.3指针变量的运算1.指针变量赋值运算【例7.2】定义三个整型变量a1、a2、a3,用指针变量完成a3=a1+a2的操作。再定义两个实型变量b1、b2,用指针变量完成b1+b2的操作。例程2.指针变量的算术运算(1)自加运算格式:指针变量++;作用:将指针变量指向下一个元素,即:指针变量=指针变量+sizeof(指针变量类型)指针变量的算术运算(2)自减运算格式:指针变量――;作用:指针变量指向上一元素,即:指针变量=指针变量―sizeof(指针变量类型)自加运算和自减运算既可后置,也可前置。(3)指针变量加n运算格式:指针变量=指针变量+n;作用:将指针变量指向下n个元素的运算,即:指针变量=指针变量+sizeof(指针变量类型)*n指针变量的算术运算(4)指针变量减n运算格式:指针变量=指针变量―n;作用:将指针变量指向上n个元素的运算,即:指针变量=指针变量―sizeof(指针变量类型)*n【例7.3】指针变量的自加、自减、加n和减n运算。例程3.指针变量的关系运算指针变量的关系运算是指针变量值的大小比较,即对两个指针变量内的地址进行比较,主要用于对数组元素的判断。【例7.4】用指针变量求一维实型数组元素和,并输出数组每个元素的值及数组和。例程4.指针运算符的混合运算与优先级(1)指针运算符*与取地址运算符&的优先级相同,按自右向左的方向结合。(2)“++”、“――”、“*”、“&”的优先级相同,按自右向左方向结合。【例7.5】指针运算符“*”、“&”、“++”优先级与结合性示例。例程7.2指针与数组7.2.1一维数组与指针1.数组指针数组的首地址称为数组指针。数组a的首地址用数组名a表示,即:数组指针=&a[0]=a。2.数组指针变量存放数组元素地址的变量称为数组指针变量。例如:inta[5];int*p=&a[0];则p为数组指针变量。【例7.6】用指针变量访问数组元素。例程由此例可以看出,访问数组元素值有三种方法:(1)移动指针变量(p++),依次访问数组元素(*p)。(2)指针变量不变,用p+i或a+i访问数组第i个元素。(3)以指针变量名p作为数组名用p[i]访问数组元素a[i]。3.数组元素的引用对一维数组a[]而言,当p=a时:①第i个元素地址:&a[i]=p+i=a+i。②第i个元素值:a[i]=*(p+i)=*(a+i)=p[i]。一维数组的第i个元素有四种方式引用:a[i]、*(p+i)、*(a+i)、p[i]。用数组指针的四种方法求一维数组中的最大值的方法为:方法一:使用*(a+i)访问a[i]方法一:用指针变量名p代替数组名a,即用p[i]代替a[i]方法二:移动指针变量p++,用*p访问a[i]方法三:使用*(p+i)访问第i个元素a[i]7.2.2二维数组与指针1.二维数组元素在内存中的存放方式(1)二维数组元素在内存按行顺序存放(2)可用指针变量来访问二维数组元素。例如:inta[3][3];【例7.7】用指针变量输出二维数组各元素的值。例程2.二维数组行首地址在二维数组a中:(1)第i行首地址(即第i行第0列元素地址):用a[i]表示,a[i]=&a[i][0](2)元素a[i][j]的地址:用a[i]+j来表示,而元素a[i]][j]的值为:*(a[i]+j)。【例7.8】定义一个3行3列数组,输出每行的首地址及所有元素值。例程3.二维数组行地址(1)第i行的行地址:用a+i或&a[i]表示。(2)行地址与行首地址区别①行地址的值与行首地址的值是相同的,即:a+i=&a[i]=a[i]=&a[i][0]②两者类型不同,行地址a+i与&a[i]只能用于指向一维数组的指针变量,而不能用于普通指针变量。③数组名a表示第0行的行地址,即:a=a+0=&a[0]。4.二维数组的元素地址与元素值(1)第i行首地址:a[i]、*(a+i)、&a[i][0]。(2)元素a[i][j]的地址:a[i]+j、*(a+i)+j、&a[i][0]+j、&a[i][j](3)元素a[i][j]值:*(a[i]+j)、*(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]【例7.9】定义二维数组a[3][3],用二种方式输出行地址,用三种方式输出行首地址,用四种方式输出所有元素地址及元素值。例程二维数组a的行地址、行首地址、元素地址、元素值的各种表示方式7.2.3字符串与指针1.字符串与字符串指针(1)字符串指针:是字符串的首地址;(2)字符串指针变量:存放字符串元素地址的变量;(3)字符串指针变量定义格式:char*指针变量=“字符串”;(4)字符串指针变量的引用【例7.10】用字符串指针变量实现字符串拷贝。例程2.字符型指针变量与字符数组的区别(1)分配内存(2)初始化赋值含义(3)赋值方式(4)输入/输出方式(5)值的改变字符数组与字符型指针变量的区别小结7.3指针变量与数组作为函数参数(习题课)7.3.1指针变量作为函数参数1.函数定义格式类型函数名(类型*指针变量名,…){函数体}2.函数调用格式函数名(&变量,…)或函数名(指针变量,…)3.实参与形参的传送方式传地址指针变量作为函数参数时实参与形参的传送方式用指针变量作为函数参数时,传送给函数的是变量地址或指针地址,所以为传地址方式。由于传送的是变量地址,所以可直接对函数内指针变量所指数据进行修改,并返回修改后的值。即:传地址可对实参单元进行修改,并返回修改值。当函数需要返回多个参数值时,可使用指针变量作为参数来实现。而传值方式的函数调用,只能返回一个函数值,其形参值是无法返回的。指针变量作为函数参数举例【例7.11】编写两个数据交换函数,用指针变量作为函数参数实现两个数据的交换,交换过程如图所示。例程通过指针实现数据交换p20.510.5q(b)数据交换后(a)数据交换前p10.520.5q*p=x*q=ytemp指针变量作为函数参数举例【例7.12】用指针变量作为函数参数,编写字符串复制函数str_cpy(char*p1,char*p2)。在主函数中定义二个字符数组str1[80]、str2[80],用getline()函数将字符串输入str2中,然后调用str_cpy()函数将str2复制到str1中,最后输出str1。例程7.3.2数组与指针作为函数参数由于数组名为数组的起始地址,当把数组名作为函数参数时,其作用与指针相同,均为传地址。数组与指针作为函数参数有四种情况:(1)函数的实参为数组名,形参为数组。(2)函数的实参为数组名,形参为指针变量。(3)函数的实参为指针变量,形参为数组。(4)函数的实参为指针变量,形参为指针变量。【例7.13】用指针与数组作为函数参数,用四种方法求整型数组的最大值。例程【例7.14】用指针与数组作为函数参数,用四种方法实现一维整型数组的排序。例程指针变量、数组指针变量、字符型指针变量小结指针变量、数组指针变量、字符型指针变量都属于同一类型的指针变量,它们的定义格式为:类型*指针变量名=&变量;只有赋给指针变量地址时才能确定是属于哪一类指针变量。例如:变量的指针变量:intx=10,*p1=&x;数组的指针变量:inta[5]={1,2,3,4,5},*p2=a;字符串指针变量:chars[5]=”ABCD”,*p3=s;7.4指针数组和指向一维数组的指针变量7.3.1指针数组(1)指针数组:由若干个同类型指针变量所组成的数组称为指针数组,指针数组中每一个元素都是一个指针变量。(2)指针数组定义格式为:〔存储类型〕类型*数组名[数组长度];其中:*数组名[数组长度]表示定义了一个指针数组,类型指明指针数组中每个元素所指向的数据类型。指针数组例如,指针数组的定义:int*pi[4];表示定义了由4个整型指针元素pi[0]、pi[1]、pi[2]、pi[3]组成的整型指针数组。char*pc[4];表示定义了由4个字符型指针元素pc[0]、pc[1]、pc[2]、pc[3]组成的字符型指针数组。(3)指针数组元素的引用【例7.15】用指针数组输出字符串数组中各元素的值。例程注意:除了用初始化方法给字符串数组c赋值外,也可用cin语句输入字符串到c[i]中。指针数组举例【例7.16】将若干个字符串按升序排序后输出。例程7.4.2指向一维数组的指针变量1.作用:用于表示二维数组某行各元素值。2.定义格式:类型(*指针变量名)[数组的列数];例如:inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};int(*p)[3];//数组长度3必须与二维数组a[3][3]的列数3相同p=&a[0];指向一维数组的指针变量3.引用定义了指向一维数组的指针变量p后,只要将二维数组a第i行的行地址a+i或&a[i]赋给p,即:p=a+i;或p=&a[i];则可用(*p)[0]、(*p)[1]、…(*p)[n-1]来表示数组a第i行的元素a[i][0]、a[i][1]、…a[i][n-1]。【例7.17】用指向一维数组的指针变量,输入/输出二维数组中各元素值,求二维数组元素和,并输出元素和。例程指向一维数组的指针变量说明:(1)p所指一维数组的长度应与数组a的列数相同;(2)只能将行地址a+i或&a[i]赋给指向一维数组的指针变量p,而不能将行首地址a[i]或*(a+i)赋给p;行首地址a[i]或*(a+i)只能赋给指向数组元素的指针变量。(3)指向一维数组的指针变量p加1后,p指向数组的下一行【例7.18】用指向一维数组的指针变量为函数的形参,求二维实型数组元素和。例程7.5返回指针值的函数与函数指针变量7.5.1返回指针值的函数在前面介绍的自定义函数中,函数的返回类型可以是整型、实型、字符型等等,如求两个整数最大值函数intmax(intx,inty)的返回类型为整型。事实上,C++还允许自定义函数的返回类型为指针类型,如int*max(intx,inty)。若函数返回值为指针类型,则称该函数为返回指针值的函数。返回指针值的函数的定义与调用1.函数定义格式
本文标题:C++程序设计第7章-指针
链接地址:https://www.777doc.com/doc-1758561 .html