1、CC+程序设计程序设计大连理工大学软件学院大连理工大学软件学院 赖晓晨赖晓晨第五章第五章 指针与引用指针与引用第一节第一节 指针的概念指针的概念第二节第二节 指针在数组中的运算指针在数组中的运算第三节第三节 动态存储动态存储第四节第四节 const约束访问约束访问第五节第五节 指针与函数指针与函数第六节第六节 字符指针字符指针第七节第七节 函数指针函数指针第八节第八节 指针数组指针数组第九节第九节 主函数参数主函数参数第一节第一节 指针的概念指针的概念v指针是用来存放地址的特殊类型指针是用来存放地址的特殊类型变量变量,每一,每一种基本数据类型都有相应的指针类型。种基本数据类型都有相应的指针类型
2、。v指针变量的值为指针变量的值为内存地址内存地址。通常变量直接包。通常变量直接包含特定值,而指针则是包含特定值变量的地含特定值,而指针则是包含特定值变量的地址。址。 v指针变量的定义语句,由数据类型后跟星号,指针变量的定义语句,由数据类型后跟星号,再跟随指针变量名组成。再跟随指针变量名组成。内存单元由操作系统按字节编号,称为地内存单元由操作系统按字节编号,称为地址址 一个对象占有内存的第一个字节的地址称一个对象占有内存的第一个字节的地址称为对象的地址为对象的地址可以通过可以通过对象名对象名或或地址地址访问对象访问对象 数据对象有两种访问形式数据对象有两种访问形式读和写操作读和写操作5.1.1
3、内存访问内存访问 int a 0X0066FDF4double b 0X0066FDEC例如,例如,有说明:int a ;double b ;内存分配内存分配int a double b 0X0066FDEC内存分配内存分配变量变量a a的地址的地址例如,例如,有说明:int a ;double b ;int a 0X0066FDF4double b 0X0066FDEC内存分配内存分配由类型符由类型符 intint解释存储数据解释存储数据例如,例如,有说明:int a ;double b ;例如,例如,有说明:int a ;double b ;int a 0X0066FDF4double b
4、 内存分配内存分配变量变量b b的地的地址址例如,例如,有说明:int a ;double b ;int a 0X0066FDF4double b 内存分配内存分配由类型符由类型符doubledouble解释存储数据解释存储数据 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读” ”和和“ “写写” ” 例如:例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 5.1.2 名访问名访问 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读”
5、”和和“ “写写” ” 例如:例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; int aint b建立内存对象建立内存对象 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读” ”和和“ “写写” ” 例如:例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 写写操作操作int aint b1010 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读” ”和和“ “写写” ” 例如:例如:int a, b ;
6、a = 10 ;b = 20 ;a = a + b ; 写写操作操作int aint b102020 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读” ”和和“ “写写” ” 例如:例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 读读操作操作int aint b1020+2010 对于数据单元,名访问就是操作对象的内容对于数据单元,名访问就是操作对象的内容 访问形式分为访问形式分为“ “读读” ”和和“ “写写” ” 例如:例如:int a, b ;a = 10 ;b = 20 ;a = a +
7、 b ; 写写操作操作int aint b1020+201030 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象允许通过名或地址(并根据类型)访问对象 例如,例如,有说明:有说明: double b ;名字名字b所标识的所标识的浮点型对象浮点型对象5.1.3 地址访问地址访问 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象允许通过名或地址(并根据类型)访
8、问对象 例如,例如,有说明:有说明: double b ;地址地址0X0066FDEC所指的浮点型对象所指的浮点型对象 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象允许通过名或地址(并根据类型)访问对象 例如,例如,有说明:有说明: double b ;int a ; 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象允许通过名或地址(并根据类型)访问对象
9、 例如,例如,有说明:有说明: double b ;int a ; 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象允许通过名或地址(并根据类型)访问对象 例如,例如,有说明:有说明: double b ;取对象取对象b的地址:的地址:&b访问对象访问对象b:b *(&b)取对象取对象a的地址:的地址:&a访问对象访问对象a:a *(&a)取址运算符取址运算符间址运算符间址运算符例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid
10、main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; c
11、out &max endl ; cout max endl ; cout * ( &max ) endl ; 输出变量的值输出变量的值例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 输出变量的地址输出变量的地址例例5-1 测试对变量、常量的不同
12、访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 输出变量的值输出变量的值例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a end
13、l ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 输出常量的地址输出常量的地址例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * (
14、 &max ) endl ; 输出常量的值输出常量的值例例5-1 测试对变量、常量的不同访问形式测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 输出常量的值输出常量的值类型类型 * 标识符标识符 ;指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变
15、量指针变量” 5.1.4 指针变量与间址访问指针变量与间址访问 指针变量名指针变量名类型类型 * 标识符标识符 ;指针类型说明符指针类型说明符类型类型 * 标识符标识符 ;指针所指对象的类型指针所指对象的类型(指针的关联)(指针的关联)类型类型 * 标识符标识符 ;例如例如int * iptr ; / iptr 是指向整型对象的指针,可以存放一个整型是指向整型对象的指针,可以存放一个整型变量的地址变量的地址 char * s ;/ s 是指向字符对象的指针是指向字符对象的指针double * dPtr ;/ dPtr 是指向浮点对象的指针是指向浮点对象的指针类型类型 * 标识符标识符 ;一个一
16、个*只能表示一个指针。只能表示一个指针。int* ip,a; /a不是指针变量不是指针变量char* ip1, *ip2;指向整型数的指针是包含该整型数地址指向整型数的指针是包含该整型数地址的变量的变量 :int* ip; 指向字符的指针是包含该字符地址的变指向字符的指针是包含该字符地址的变量量 :char* ip; 指针是变量,需要赋值之后才能使用。指针是变量,需要赋值之后才能使用。&可以用来获取变量的地址,指针变量用于可以用来获取变量的地址,指针变量用于存放地址。存放地址。int* ip;int a=20;ip=&a;0000:F822200000:F822ipa下列语句十分危险!下列语句
17、十分危险!# include void main ()int* p;*p=20;?20?pint i = 1 ;int * iPtr1 , * iPtr2 ;char * cPtr ;iPtr1 = & i ; / 合法合法iPtr2 = iPtr1 ; / 合法合法iPtr2 = i ; / 非法,非法, i 不是不是 int * 对象对象cPtr = iPtr1 ; / 非法,非法, iPtr1 不是不是 char *对象对象i = iPtr1;/ 非法,非法,iPtr1 不是不是 int对象对象 取地址操作取地址操作 间址访问操作间址访问操作 例如例如 int a = 3 , b = 4
18、 ;float c = 4.5 , d = 8.6 ;char e = x , f = y ; int * pa = &a , * pb = &b ;float *pc = &c , *pd = &d ;char * pe = &e , *pf = &f ; abcdef344.58.6abcdef344.58.6papbpcpdpepf344.58.6xy每个指针都有一个类型(每个指针都有一个类型(void*除外),除外),指针是变量,因此它与其他基本数据类型一指针是变量,因此它与其他基本数据类型一样,凡是可以声明变量的地方,都可以声明样,凡是可以声明变量的地方,都可以声明指针变量。它可以是
19、全局、静态全局、静态指针变量。它可以是全局、静态全局、静态局部和局部的。局部和局部的。“*”放在放在可执行语句可执行语句中的指针之前,称为中的指针之前,称为间接引用操作符间接引用操作符,可获得由该指针指向的变,可获得由该指针指向的变量的内容。量的内容。 “*”放在放在指针定义指针定义中,称为中,称为指针指针定义符定义符。#include void main() int a=20,*j;j=&a;coutjendl*jendl;区别以下几个区别以下几个“*”表示的含义。表示的含义。#include void main() int *p;int a=1*2;p=&a;*p=20;cout*pend
20、l;辨析辨析int b=5;int *p=&b;*p=&b;指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;例:例: 指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int
21、a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE0指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FD
22、E4int *p1 0X0066FDE0指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF4指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066
23、FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF4*p1* *p1p1指针指针p1p1所指的对象所指的对象指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ;
24、p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF0*p1指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE
25、4int *p1 0X0066FDE00X0066FDF4*p1*p2* *p2p2指针指针p2p2所指的对象所指的对象0X0066FDF0指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ;/ *p1 = 10 b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0
26、066FDF010*p1*p2指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ;/ *p2 = 20 a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF010*p1*p220指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,
27、简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF010*p1*p220指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ;
28、 int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1
29、+ *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址访问间址访问 读出变量读出变量 的地址的地址值值 查找该地址的存储单查找该地址的存储单元元 读出数据读出数据指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;
30、int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址访问间址访问 读出变量读出变量 的地址的地址值值 查找该地址的存储单查找该地址的存储单元元 读出数据读出数据指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2
31、 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址运算间址运算(指针运算)(指针运算)指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X00
32、66FDF030*p1*p220指针类型说明指针类型说明指针类型变量指针类型变量能够存放对象地址的变量,简称能够存放对象地址的变量,简称“指针变量指针变量” int a 0X0066FDF4int b 0X0066FDF0int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220int *p1int *p2int aint b*p1*p2/ 例例5-3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; c
33、out * p endl ; cout p endl ; cout & i endl ;1.5.3 指针变量与间址访问/ 例例5-3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;1.5.3 指针变量与间址访问/通过指针变量间址访问对象通过指针变量间址访问对象/ 例例5-3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = &
34、i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;用变量名访问对象用变量名访问对象1.5.3 指针变量与间址访问/ 例例5-3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;通过指针变量通过指针变量间址访问对象间址访问对象1.5.3 指针变量与间址访问/ 例例3 间址访问对象间址访问对象#
35、include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;指针变量的值指针变量的值对象对象 i 的地址的地址1.5.3 指针变量与间址访问/ 例例3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;取对象取对象 i 的
36、直接地址值的直接地址值/ 例例3 间址访问对象间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ; cout &pendl;思考思考/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2;
37、p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 pint i1=10, i2 = 20, *p1, *p2, *p ;/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 pp1=&i1; p2=&i2;
38、* p1* p2/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 pcout *p1= *p1 t *p2= *p2 endl ;* p1* p2Output*p1 = 10*p2 = 20/ 例例5-4 交换指针值交换指针值# include void main
39、 () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 pp=p1;* p1* p2* pOutput*p1 = 10*p2 = 20/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1
40、 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 pp1=p2;* p1* p* p2Output*p1 = 10*p2 = 20/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl
41、 ; p1 10 i1 p2 20 i2 pp2=p;* p1* p* p2Output *p1 = 10*p2 = 20/ 例例5-4 交换指针值交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; p=p1; p1=p2; p2=p; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 p* p1* p* p2cout *p1= *p1 t *p2= *p2 endl ;*p1
42、 = 20*p2 = 10Output *p1 = 10*p2 = 20/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 iint i1=10, i2 = 20, i , *p1, *p2 ;/例例5-5 交换指针所指对象的值交换指针所指
43、对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2p1=&i1; p2=&i2;* p1* p2 i/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1;
44、p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2cout *p1= *p1 t *p2= *p2 endl ;* p1* p2 iOutput*p1 = 10*p2 = 20/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2
45、 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2i=*p1;* p1* p2 i10Output*p1 = 10*p2 = 20/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2
46、 endl ; p1 10 i1 p2 20 i2*p1=*p2;* p1* p210i 20 Output*p1 = 10*p2 = 20/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 20 i1 p2 20 i2*p2=i;10i* p1* p2 10 Outp
47、ut*p1 = 10*p2 = 20/例例5-5 交换指针所指对象的值交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl ; i=*p1; *p1=*p2; *p2=i; cout *p1= *p1 t *p2= *p2 endl ; p1 20 i1 p2 10 i2cout *p1= *p1 t *p2= *p2 endl ;*p1 = 20*p2 = 1010i* p1* p2Output*p1 = 10*p2 =
48、 20例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ;5.1.5 指向指针的指针指向指针的指针指针变量的地址、二级指针指针变量的地址、二级指针例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2指向指针的指针指向指针的指针例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1指向指针的指针指向指针的指针例如例如 int * * p2 ; int * p1
49、; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i指向指针的指针指向指针的指针例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i指向指针的指针指向指针的指针 &i *p1例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i &i *p1指向指针的指针指向指针的指针 &p1 *p2例如例如 int * * p2 ; int * p1 ; int i = 3 ; p1
50、= & i ; p2 = & p1 ; p2 p1 3 i &p1 *p2 &i *p1 / 非法,非法, p2 必须取指针变量的地址必须取指针变量的地址 / 非法,非法, i 不是指针不是指针指向指针的指针指向指针的指针/ 例例5-6 # include void main() int *p4, *p3, *p2, *p1, i = 3 ; p4 = &p3; p3 = &p2; p2 = &p1; p1=&i; cout *p4 endl ; 3 i &i p1 &p1 p2 &p2 p3 &p3 p4指向指针的指针指向指针的指针例例5-8 指向指针的指针指向指针的指针# include