您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > 西南交通大学 戴克俭 c++ 第五章
1第五章指针的应用西南交通大学软件学院计算机基础教研室戴克俭制作C++编程导论2第五章指针的应用教学目标:1.着重介绍指针与指针变量的概念;2.指针类型变量的定义、赋值以及引用的方法;3.指针与地址运算符;4.通过指针类型的变量去访问单一变量;5.通过指针类型的变量去操作一维数组;6.通过指针类型的变量去操作二维数组;7.动态存储分配的概念及应用。3第五章指针的应用教学内容:1.掌握地址和指针的概念2.掌握指针类型变量的定义、赋值以及引用的方法3.掌握将一个变量或数组的地址赋给指针类型的变量4.掌握指针操作相关的运算符;5.掌握通过指针类型的变量去访问单一变量;6.掌握通过指针类型的变量去操作一维数组;7.理解通过指针类型的变量去操作二维数组;8.理解动态存储分配的概念及应用。4§5.1指针的概述[例5.1.1]阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){inta;int*p;a=10;p=&a;5§5.1指针的概述couta的值表示方法1:aendl;couta的值表示方法2:*pendl;couta的地址表示方法1:&aendl;couta的地址表示方法2:pendl;}编程技巧:在源程序清单中,我们可以看到在操作变量a时,用了不同的两种方法,一种就是用我们很习惯的变量名的方式操作,另一种就是本章要学习的新概念指针的方式操作。6§5.1指针的概述1.指针是C++从C中继承过来的重要的概念,它提供了一种较为直观的地址操作的手段。正确地使用指针,可以方便、灵活而有效地组织和表示复杂的数据结构。2.利用指针可以进行动态内存分配和管理,可以更灵活地使用内存空间。3.为了理解指针,要先理解关于内存地址的概念。计算机的内存储器就像一个巨大的一维数组,每个数组元素就是一个存储单元。就像数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,这个编号就称为内存单元的地址。在微型计算机,地址编码的基本单位是字节,每个字节是一个基本内存单元。7§5.1指针的概述4.在运行一个程序时,程序本身及其所用到的数据都要放在内存储器中。程序、函数、变量、常数、数组和对象等,在内存储器中都要占有一席之地。存放在内存储器中的程序和数据都有一个地址,用它们占用的那片存储单元中的第一个存储单元的地址表示。5.在C++中,为某个变量、函数常数、数组和对象等分配内存储器的工作由编译程序完成。计算机通过这种地址编号的方式来管理内存数据读写的准确定位。程序中声明的变量是要占据一定的内存空间的,不同的数据类型占用的字节数是不一样的,例如:char型占1个字节,short型占2个字节,int型和long型都占4个字节。如图5-1所示,表明了每一个内存单元都有自己的地址,在地址所标志的内存单元中可用来存放数据,一般称为内存单元的内容。8§5.1指针的概述内存单元内存单元内存单元2000200120023000地址编号内存储器……36…3004内存单元的地址内存单元的内容inti=3;intj=6;96.在C++程序中是如何从内存单元中存取数据的呢(1)是通过变量名,称为直接访问方式,直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。例如:[例5.1.1]中,用语句:couta的值表示方法1:aendl;来输出变量a的值。§5.1指针的概述10(2)是通过地址,称为间接访问方式,先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。例如:[例5.1.1]中,用语句:couta的值表示方法2:*pendl;来输出变量a的值。(3)有时使用变量名不够方便或者根本没有变量可用,这时就需要直接用地址来访问内存单元。例如,在不同的函数之间传送大量数据时,如果不是传递变量值,而是只传递变量的地址,就会减小开销,提高效率。如果是动态分配的内存单元,则根本就没有名称,这时只能通过地址访问。§5.1指针的概述11§5.1指针的概述1.如何通过地址来操作呢?在C++中专门用一种数据类型,称为“指针”数据类型来表示“地址”,指针实际上是某个内存单元的首地址。一个变量在内存空间中占用的地址就称为该变量的“指针”。2.程序中定义的任何变量、数组或函数等,在编译时都会在内存中分配一个确定的地址单元,即都有地址。C++规定:12(1)变量的地址可以用&表示。例如,&i表示变量i的地址。(2)数组的地址,即数组第一个元素的地址,可以直接用数组名表示。例如,a或&a[0]。(3)函数的地址用函数名表示。(关于函数的概念将在下一章学习)§5.1指针的概述131.如何使用指针呢?(1)由于指针是一种数据类型,是包含另一个变量地址的变量,指针也是一个变量,应遵循先定义,后使用。(2)定义指针类型是由该指针指向的变量类型决定。定义指针变量的一般格式如下:①定义语句中的“*”表示该变量为指针变量。§5.2指针变量的定义、赋值及使用存储类型数据类型*指针变量14②数据类型标识符规定了指针变量指向的数据类型例如:[例5.1.1]中,定义语句:int*p;“*”表示该变量p为指针变量;且指针变量p只能操作整型数据。§5.2指针变量的定义、赋值及使用152.指针变量的初始化的常用形式:与变量定义一样,定义好指针变量后也可以对它进行初始化,指针变量可以初始化为0、NULL或一个地址。数值为0或者NULL的指针不指任何内容。数值0是可以直接赋给指针变量的唯一整数值。(1)指针变量的初始化常用的第一种形式:在定义指针变量的同时进行初始化赋值,一般格式如下:数据类型*指针名=初始地址;§5.2指针变量的定义、赋值及使用16例如:inta=3;int*pa=&a;(2)指针变量的初始化常用的第二种形式:定义指针变量后,用赋值语句将其初始化。指针变量名=地址;可以是变量的地址、数组名、函数名等。例如:先定义:int*p;再用赋值语句:p=&x;§5.2指针变量的定义、赋值及使用17(3)使用时注意事项:①指针的类型是它所指向变量的类型。②已赋初值的指针可以初始化另一个指针变量。例如:q=p;由于p已经有值,可以来初始化q。③用变量地址作为初值时,该变量的定义必须在指针初始化之前定义。例如:[例5.3.1]中,inta=3;int*pa=&a;intx;int*p;p=&x;变量的定义一定要在指针定义之前。§5.2指针变量的定义、赋值及使用18④不能把常量或表达式的地址赋给指针变量。例如: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指针变量的定义、赋值及使用193.使用时要注意指针与指针变量的区别:指针是内存单元的地址,简称地址。指针变量是用于存储变量地址的变量。§5.2指针变量的定义、赋值及使用201.为了使用指针变量,要掌握两个运算符:(1)指针运算符*,也称为“间接访问”运算符,是一个一元运算符,表示指针变量所指向的变量的值。(2)取地址运算符&,是一个一元运算符,用来得到一个对象的地址,例:&x,取变量x的地址。取地址运算符的操作数必须是变量名。2.使用指针变量与使用一般变量一样,一定要先定义后使用,使用前,指针变量一定要有明确的指向,例如,int*p;,p=&x;明确指向变量x的地址。§5.2指针变量的定义、赋值及使用21§5.3通过指针变量访问单一变量[例5.5.1]阅读如下程序:源程序清单:#includeiostreamusingnamespacestd;voidmain(){intx,*p;x=3;p=&x;*p=*p+10;cout*pendl;}22§5.3通过指针变量访问单一变量编程技巧:1.程序中定义指针变量p,它的数据类型与它要操作的变量的数据类型一致,[例5.5.1]中同为int。2.定义好指针变量p后,用赋值语句p=&x;将它要操作的变量的地址赋给了指针变量p。3.用间接访问*p,替代变量名来操作变量,[例5.5.1]中*p=*p+10;在原来的值3基础上加上10,与语句x=x+10;等价。4.用*p输出值,即输出值为13。235.注意事项:(1)*出现在定义语句中和执行语句中其含义是不同的例如:[例5.5.1]中,intx,*p;在该语句中,*p是一个int型指针,*在定义语句中,表示定义的是指针变量cout*p;在该语句中,*p是输出指针p的内容,*在执行语句表示指针所指对象的内容。(2)p=&x;将变量x的地址赋给指针变量p,一定要先定义x,然后才能将变量x的地址赋给指针变量p,p有明确的指向后才能操作。§5.3通过指针变量访问单一变量24[例5.5.2]输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。思路分析:输入两个整数,判断谁大谁小,若a大输出a,b;若a小输出b,a。算法描述:§5.3通过指针变量访问单一变量输出*p1、*p2的值输出*p2、*p1的值*p1*p2YN用指针操作方式从键盘获取输入两个整数的值定义两个整型变量,及操作它们的两个整型指针,并把两个整型变量的地址分别赋给两个整型指针25源程序清单:#includeiostream#includeiomanipusingnamespacestd;voidmain(void){inta,b;int*p1=&a;int*p2=&b;coutinputaandb:endl;cin*p1*p2;§5.3通过指针变量访问单一变量26if(*p1*p2)cout按先大后小的顺序输出的a和b为:*p2setw(4)*p1endl;elsecout按先大后小的顺序输出的a和b为:*p1setw(4)*p2endl;}编程技巧:1.利用间接访问方式来操作。§5.3通过指针变量访问单一变量27§5.4通过指针变量操作一维数组在C++中,有了指针和地址的概念,我们在操作数组时,就可以用如下的四种方法来操作数组。使用数组名和下标使用数组名和指针运算使用指针变量使用下标表示法引用指针指向的数组元素[例5.6.1]设有一个int型数组a,有10个元素,请用上述的四种方法去访问数组的各个元素。28源程序清单:#includeiostreamusingnamespacestd;voidmain(){inta[10];inti,*p;for(i=0;i10;i++)cina[i];//数组名和下标来访问数组§5.4通过指针变量操作一维数组29for(i=0;i10;i++)cout*(a+i);//数组名和指针运算来访问数组for(p=a;p-a10;p++)cout*p;//指针变量的移动来访问数组p=a;for(i=0;i10;i++)coutp[i];//下标表示法}§5.4通过指针变量操作一维数组30编程技巧:1.例中第一种方法操作数组时,使用数组名和下标来访问数组,是第四章中我们已经学习和掌握的方法。2.例中第二种方法操作数组时,使用数组名和指针运算来访问数组,利用了数组名a是数组首地址,是一个地址常量,是数组第一个元素的地址,但数组名所代表的首地址只是一个指针常量,是固定的指针,我们不能对数组名赋予一个新的地址值,也不能使这指针常量“移动”,指向数组的其它元素,要指向其它数组元素时,通过首地址加上一个值,使之指向其它的数组元素。例如:[例5.6.1]中就通过*(a+i)
本文标题:西南交通大学 戴克俭 c++ 第五章
链接地址:https://www.777doc.com/doc-7028571 .html