C++程序设计 第六章 指针与数组
PAGE
PAGE 15
指针与数组
指针是C++的难点之一,也是最易出错的知识点。C++语言拥有在运行时获得变量地址和操纵地址的能力,这一点对有关计算机底层的程序设计是非常重要的。这种可用来操纵地址的变量类型就是指针。指针可以用于数组,用于内存访问,还可作为函数的参数。除C++外,没有哪一种高级语言具有功能这么强大的指针。指针的功能很强,但使用不当又会带来严重的后果。所以学习本章时一定要特别细心和认真。本章将深入学习数组包括多维数组的知识,以及它们与指针和多级指针的关系及应用。最后,探讨各种复杂指针的概念和应用。
算法,尤其是通用的算法是程序设计的重点,模板是建立通用的与数据类型无关的算法的重要手段,因此在学习与数据结构相关的表、排序与查找的知识和算法时,要逐步熟悉函数模板和类模板的编程方法。
6.1 指针与地址
在本小节中,将学习指针与变量占用的存储器单元大小及首地址之间的关系,学习指针的基本使用方法。
6.1.1指针的概念
在高级语言编程中,面对的是变量名,而源程序经过编译系统处理后,每一个变量在程序执行前将分配在内存指定的位置上。程序执行中,计算机是到与变量名对应的内存地址去处理放在那里的数据。设有一个整型变量i,编译后,I存放在2700H开始的四个字节中,计算机进行i++运算,则把2700H开始的四个字节的内容取到运算器中,执行增量指令,所得结果放回2700H开始的四个字节中。这种按变量的地址直接存取变量的方法称为“直接访问”方式。存储变量的内存空间的首地址称为该变量的地址。
如果将一个变量的地址放在另一个变量中,则存放地址的变量称为指针(Pointer)型变量。这时存取变量,也可以间接的由指针变量取得该变量的地址进行,这称为“间接访问”方式。由于指针变量中的值是另一个变量的地址,我们习惯上形象地称为指针变量指向该变量。指针变量中的值也简称为指针,所以指针就是地址。
指针类型可以按它指向的变量的类型区分。基本类型和派生类型都有对应的指针类型,包括类(class),甚至还有指针类型(指向指针的指针,二级指针)。
为什么要明确指针是指向哪一种数据类型的呢?因为指针中只放变量首地址是不够的,还要知道占多少内存?数据又是怎样组织的?整型数占4个字节,浮点数占4个字节,字符型占1个字节,宽字符占2个字节;并且它们有各自不同的存储组织方式。
指针类型变量定义语句格式如下:
《存储类型》 类型 *变量名1《,*变量名2…》;
这里*是一个定义变量为指针的说明符,而不是指针变量的一部分。*前后可以加空格,也可不加。必须指出的是定义时每一个指针变量都需要一个指针变量说明符。例如:
int *lp1,*lp2;
如果写成
int *lp1,lp2;
则编译器认为lp2是整型变量,只有lp1是指向整型变量的指针型变量。
6.1.2 指针变量的赋值、初始化与简单应用
前面所介绍的所有类型的变量或对象的数据成员都可以赋以相应类型正确的数据,但是对指针变量决不可以任意赋一个内存地址。指针变量中存放的是在内存中可寻址的变量或对象的首地址,而变量或对象的内存地址是由编译系统来分配的(当然最终是由操作系统来安排的)。程序员不能代替系统给变量分配内存,当然也就不能给指针变量随意赋一个地址值,只能取一个已经分配了内存的变量的地址赋给指针变量。C++中有两个专门的运算符与指针有关。
“&”取地址运算符,作用于内存中一个可寻址的数据(如:变量,对象和数组元素等等),操作的结果是获得该数据的地址。运算结果不可作为左值。
“*”间接引用(dereference)运算符,作用于一个指针类型的变量,访问该指针所指向的内存数据。因结果是内存中可寻址的数据,所以它可以作为左值。
【例6.1】指针赋值实例:
2018
20
18
1
p_age
age1
2
age2
void main(){
int age1=18,age2=20,*p_age;
p_age=&age1; //情况1,见图6.1
cout<
p_age=&age2;
图6.1指针赋值 //情况2,指针改指另一变量,见图6.1
图6.1指针赋值
cout<
}
注意:指针变量p_age在定义说明时要加“*”,这里“*”为说明符;而在可执行语句中p_age不用也不允许加“*”号。在可执行语句中“*”为间接引用运算符,*p_age代表p_age所指向的在内存中可寻址的数据。在上例中最后的*p_age就是age2。
指针变量可以初始化,例如:
int age ,*p_age=&age