指针又称指针变量,是C++语言的精髓,也是其最强大的功能之一。因为有了指针,C++语言 可以和汇编语言比效率。指针同时也是最棘手的功能之一,尽管有时候容易被误用,但在C++ 编 程中起到至关重要的作用。在教学过程中,指针这部分内容常常给学生带来困惑,本章将详细介 绍指针在C++程序中的用法。 5.1 指针的概念及声明格式 ................................ 5.1.1 指针的概念 在2.2.3节中介绍过变量包含三个要素,分别是变量类型、变量名和变量的值,其中变量的值 包括变量的数据值和变量的地址值。可以把变量的地址值存入另外一个变量,存储变量的地址值 的变量称为指针变量。 1.指针变量的相关术语 ● 指针变量与一般变量不同,它的值是某个变量在内存中的地址。 ● 一个指针变量存放了哪个变量的地址,就说这个指针指向了哪个变量。 ● 指针变量必须初始化或者赋值(指向了变量)后,才能进行间接访问操作。 2.内存空间的访问方式 ● 通过变量名访问。 ● 通过地址访问(通过指针间接访问它所指向变量的值)。 “&”是取地址符,例如: int x; 1 77 语句声明整型变量x,则&x表示变量x在内存中的地址。x是整型数据,占4字节的内存单元,那 么x的地址就可以存放在一个指针变量里,指针变量与其他类型变量一样,也必须先进行指针变 量的声明。 5.1.2 指针变量声明格式 1.指针变量声明 指针变量声明的一般格式如下: 存储类型 数据类型 *指针名=初始值(另一个变量的地址); 或者 存储类型 数据类型 *指针名; 例如: int *pi=&x; 2.指针的赋值 ● 上面的语句声明了指针变量pi,pi是指针名,int是数据类型,声明指针变量可以存储int类 型变量的地址,不可以用其他类型变量的地址给指针变量pi赋初值或赋值。 ● 上面的语句虽然没有给指针变量pi指定存储类型,但默认的存储类型为auto类型,即存储 类型为自动类型,pi是自动类型局部指针变量,存放在栈空间,由编译系统管理pi变量的所 占用的内存单元。 ● 声明语句中变量pi前的星号“*”非常重要,有了星号“*”,才能说明pi是指针变量,才能 存放另外一个整型变量的地址,所有在声明语句中的星号“*”只是一个标记。 ● 上面的语句声明了指针变量pi,并且给该指针变量赋初值,初始值为x变量的地址,x变量 必须是声明了int类型的变量,那么就可以说pi指向了int类型的变量x。 ● 定义指针变量的时候可以赋初值,也可以不赋初值。如果赋初值,需要注意的是,初值变量 必须在指针初始化之前已声明过,且变量类型应与指针类型一致。也可以用一个已赋初值 的指针变量去初始化另一个同类型的指针变量。 ● 既然pi是一个指针变量,那么pi也会占用内存单元,因此变量pi也有地址,&pi就是指针 变量pi的地址。不管指向什么类型变量的指针,所占用的空间大小是一样的,在32位编译 器中都占用4个字节的内存单元,在64位编译器中都是占用8个字节的内存单元。 ● 如果指针没有赋初值,则需在使用指针间接访问它所指向的变量前,一定要赋值。这很好 理解,指针没有指向变量,怎么能间接访问其指向变量的数据值呢? 因此说通过指针间接 访问前,指针不能为空值。 3.程序代码及运行结果 (1)程序代码 【例5.1】 指针定义。 #include using namespace std; 1 78 int main() { int x = 100; //声明x 变量,并赋初值100 int *pi = &x; //声明pi 指针变量,并赋值为x 的地址 cout << "x="< using namespace std; int main() { int *p; int x=57; cout<<"1:x="< using namespace std; int main() { int *p,*q,a[10]={0,1,2,3,4,5,6,7,8,9}; p=a; //p 指针指向第1 个数组元素 q=&a[9]; //q 指向第10 个数组元素 1 84 cout<<"数组的长度是: "<和>=这样的关系运算,指针的关系运算 实际就是比较地址。如果p指向数组的第一个元素,q指向数组的第2个数组元素,则关系表达式 p using namespace std; void reverse(int a[],int n) { int *p,*q,t; p=&a[0]; //p 指向首元素 q=&a[n-1]; //q 指向尾元素 while(p