C++课件-第五章 part1 指针_第1页
C++课件-第五章 part1 指针_第2页
C++课件-第五章 part1 指针_第3页
C++课件-第五章 part1 指针_第4页
C++课件-第五章 part1 指针_第5页
已阅读5页,还剩502页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CC+程序设计大连理工大学软件学院 赖晓晨far.away1.第五章 指针与引用第一节 指针的概念第二节 指针在数组中的运算第三节 动态存储第四节 const约束访问第五节 指针与函数第六节 字符指针第七节 函数指针第八节 指针数组第九节 主函数参数2.第一节 指针的概念指针是用来存放地址的特殊类型变量,每一种基本数据类型都有相应的指针类型。指针变量的值为内存地址。通常变量直接包含特定值,而指针则是包含特定值变量的地址。 指针变量的定义语句,由数据类型后跟星号,再跟随指针变量名组成。3.内存单元由操作系统按字节编号,称为地址 一个对象占有内存的第一个字节的地址称为对象的地址可以通过对象名或地址

2、访问对象 数据对象有两种访问形式读和写操作5.1.1 内存访问 4.int a 0X0066FDF4double b 0X0066FDEC例如,有说明:int a ;double b ;内存分配5.int a 0X0066FDF4double b 0X0066FDEC内存分配变量a的地址例如,有说明:int a ;double b ;6.int a 0X0066FDF4double b 0X0066FDEC内存分配由类型符 int解释存储数据例如,有说明:int a ;double b ;7.例如,有说明:int a ;double b ;int a 0X0066FDF4double b 0X

3、0066FDEC内存分配变量b的地址8.例如,有说明:int a ;double b ;int a 0X0066FDF4double b 0X0066FDEC内存分配由类型符double解释存储数据9. 对于数据单元,名访问就是操作对象的内容 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 5.1.2 名访问 10. 对于数据单元,名访问就是操作对象的内容 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; int aint b建立内存对象11. 对于数据单元,名访问就是操作

4、对象的内容 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 写操作int aint b101012. 对于数据单元,名访问就是操作对象的内容 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 写操作int aint b10202013. 对于数据单元,名访问就是操作对象的内容 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 读操作int aint b1020+201014. 对于数据单元,名访问就是操作对象的内容

5、 访问形式分为“读”和“写” 例如:int a, b ;a = 10 ;b = 20 ;a = a + b ; 写操作int aint b1020+20103015. 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象 例如,有说明: double b ;名字b所标识的浮点型对象5.1.3 地址访问 16. 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象 例如,有说明: double b ;地址0X0066FDEC所指的浮点型对象17. 程序被编译后,系统对已声明对象保存一张名表

6、,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象 例如,有说明: double b ;int a ; 名字a所标识的整型对象18. 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象 例如,有说明: double b ;int a ; 地址0X0066FDF4所指的整型对象19. 程序被编译后,系统对已声明对象保存一张名表,登记它们对象的属性 C+允许通过名或地址(并根据类型)访问对象 例如,有说明: double b ;取对象b的地址:&b访问对象b:b *(&b)取对象a的地址:&a访问对象a:a *(&a)取址运算符

7、间址运算符20.例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 ; 21.例5-1 测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a )

8、endl ; cout *( &a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl; 输出变量的值22.例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 ; 输出变量的地址23.例5-1 测试对变量、常量

9、的不同访问形式#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 ; 输出变量的值24.例5-1 测试对变量、常量的不同访问形式#includevoid main() int a = 451 ; const int max = 1000 ; cout a endl ; cout ( &a ) endl ; cout *(

10、&a ) endl ; cout &max endl ; cout max endl ; cout * ( &max ) endl ; 输出常量的地址25.例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 ; 输出常量的值26.例5-1 测试对变量、常量的不同访问形式#includ

11、evoid 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 ; 输出常量的值27.定义形式 :类型 * 标识符 ;指针类型变量能够存放对象地址的变量,简称“指针变量” 5.1.4 指针变量与间址访问 28.指针变量名类型 * 标识符 ;定义形式 :29.指针类型说明符类型 * 标识符 ;定义形式 :30.指针所指对象的类型(指针的关联)类型 *

12、 标识符 ;定义形式 :31.例如int * iptr ; / iptr 是指向整型对象的指针,可以存放一个整型变量的地址 char * s ;/ s 是指向字符对象的指针double * dPtr ;/ dPtr 是指向浮点对象的指针 类型 * 标识符 ;定义形式 :32.一个*只能表示一个指针。int* ip,a; /a不是指针变量char* ip1, *ip2;定义形式 :33.指向整型数的指针是包含该整型数地址的变量 :int* ip; 指向字符的指针是包含该字符地址的变量 :char* ip; 定义形式 :34.指针是变量,需要赋值之后才能使用。&可以用来获取变量的地址,指针变量用于

13、存放地址。int* ip;int a=20;ip=&a;0000:F822200000:F822ipa指针赋值 35.下列语句十分危险!# include void main ()int* p;*p=20;?20?p指针赋值 36.指针赋值 int i = 1 ;int * iPtr1 , * iPtr2 ;char * cPtr ;iPtr1 = & i ; / 合法iPtr2 = iPtr1 ; / 合法iPtr2 = i ; / 非法, i 不是 int * 对象cPtr = iPtr1 ; / 非法, iPtr1 不是 char *对象i = iPtr1;/ 非法,iPtr1 不是 i

14、nt对象37.& 取地址操作* 间址访问操作 例如 int a = 3 , b = 4 ;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 ; abcdef100610101014101810221023344.58.6xy38.abcdef100610101014101810221023344.58.6xypapbpcpdpepf20002004200820122016202020241006

15、10101014101810221023&a3paa, *pa&b4pbb, *pb&c4.5pcc, *pc&d8.6pdd, *pd&expee, *pe&fypff, *pf39.每个指针都有一个类型(void*除外),指针是变量,因此它与其他基本数据类型一样,凡是可以声明变量的地方,都可以声明指针变量。它可以是全局、静态全局、静态局部和局部的。40.“*”放在可执行语句中的指针之前,称为间接引用操作符,可获得由该指针指向的变量的内容。 “*”放在指针定义中,称为指针定义符。#include void main() int a=20,*j;j=&a;coutjendl*jendl;间接引

16、用 41.区别以下几个“*”表示的含义。#include void main() int *p;int a=1*2;p=&a;*p=20;cout*pendl;间接引用 42.辨析int b=5;int *p=&b;*p=&b;间接引用 43.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;例: 44.指针类型变量能够存放对象地址的变量,简称“指针变量” i

17、nt 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 0X0066FDE045.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;i

18、nt *p2 0X0066FDE4int *p1 0X0066FDE046.指针类型变量能够存放对象地址的变量,简称“指针变量” 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 0X0066FDE00X0066FDF447.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如: int a

19、, b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF4*p1*p1指针p1所指的对象48.指针类型变量能够存放对象地址的变量,简称“指针变量” 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

20、4int *p1 0X0066FDE00X0066FDF40X0066FDF0*p149.指针类型变量能够存放对象地址的变量,简称“指针变量” 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*p1*p2*p2指针p2所指的对象0X0066FDF050.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0

21、X0066FDF4int 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 0X0066FDE00X0066FDF40X0066FDF010*p1*p251.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a

22、= 10 ; b = 20 ;/ *p2 = 20 a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF010*p1*p22052.指针类型变量能够存放对象地址的变量,简称“指针变量” 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

23、0X0066FDF010*p1*p220+53.指针类型变量能够存放对象地址的变量,简称“指针变量” 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 0X0066FDE00X0066FDF40X0066FDF030*p1*p220+54.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如:

24、 int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 10 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址访问 读出变量 p1 的地址值 查找该地址的存储单元 读出数据55.指针类型变量能够存放对象地址的变量,简称“指针变量” int a 0X0066FDF4int b 0X0066FDF0例如: int a , b ; int *p1 , *p2 ; p1 = &a ; p2 = &b ; a = 1

25、0 ; b = 20 ; a = *p1 + *p2 ;int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址访问 读出变量 p1 的地址值 查找该地址的存储单元 读出数据56.指针类型变量能够存放对象地址的变量,简称“指针变量” 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

26、0X0066FDE00X0066FDF40X0066FDF030*p1*p220间址运算(指针运算)57.指针类型变量能够存放对象地址的变量,简称“指针变量” 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 0X0066FDE00X0066FDF40X0066FDF030*p1*p220指针类型说明58.指针类型变量能够存放对象地址的变量,简称“指针变量” i

27、nt a 0X0066FDF4int b 0X0066FDF0int *p2 0X0066FDE4int *p1 0X0066FDE00X0066FDF40X0066FDF030*p1*p220int *p1int *p2int aint b*p1*p259./ 例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 指针变量与间址访问60./ 例5-3 间址访问对象# include

28、 void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;1.5.3 指针变量与间址访问/通过指针变量间址访问对象61./ 例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 指针变量与间址访问62./ 例5-

29、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 指针变量与间址访问63./ 例3 间址访问对象# 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

30、.3 指针变量与间址访问64./ 例3 间址访问对象# include void main ( ) int i , * p ; p = & i ; * p = 5 ; cout i endl ; cout * p endl ; cout p endl ; cout & i endl ;取对象 i 的直接地址值65./ 例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;思

31、考66./ 例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 pint i1=10, i2 = 20, *p1, *p2, *p ;67./ 例5-4 交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p

32、1=&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;* p1* p268./ 例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=

33、 *p2 endl ; p1 10 i1 p2 20 i2 pcout *p1= *p1 t *p2= *p2 endl ;* p1* p2Output*p1 = 10*p2 = 2069./ 例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 pp=p1;* p1* p2* pO

34、utput*p1 = 10*p2 = 2070./ 例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=p2;* p1* p* p2Output*p1 = 10*p2 = 2071./ 例5-4 交换指针值# include void main () int i1=10,

35、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 pp2=p;* p1* p* p2Output *p1 = 10*p2 = 2072./ 例5-4 交换指针值# include void main () int i1=10, i2 = 20, *p1, *p2, *p ; p1=&i1; p2=&i2; cout *p1= *p1 t *p2= *p2 endl

36、; 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 = 20*p2 = 10Output *p1 = 10*p2 = 2073./例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;

37、 cout *p1= *p1 t *p2= *p2 endl ; p1 10 i1 p2 20 i2 iint i1=10, i2 = 20, i , *p1, *p2 ;74./例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 i2p1=&i1; p2=&i2;*

38、p1* p2 i75./例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 i2cout *p1= *p1 t *p2= *p2 endl ;* p1* p2 iOutput*p1 = 10*p2 = 2076./例5-5 交换指针所指对象的值# include voi

39、d 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 i2i=*p1;* p1* p2 i10Output*p1 = 10*p2 = 2077./例5-5 交换指针所指对象的值# include void main () int i1=10, i2 = 20, i , *p1, *p2 ; p1=&i1; p2=&i2; co

40、ut *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*p1=*p2;* p1* p210i 20 Output*p1 = 10*p2 = 2078./例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

41、*p1= *p1 t *p2= *p2 endl ; p1 20 i1 p2 20 i2*p2=i;10i* p1* p2 10 Output*p1 = 10*p2 = 2079./例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

42、*p2= *p2 endl ;*p1 = 20*p2 = 1010i* p1* p2Output*p1 = 10*p2 = 2080.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ;5.1.5 指向指针的指针指针变量的地址、二级指针81.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2指向指针的指针82.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1指向指

43、针的指针83.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i指向指针的指针84.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i指向指针的指针 &i *p185.例如 int * * p2 ; int * p1 ; int i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i &i *p1指向指针的指针 &p1 *p286.例如 int * * p2 ; int * p1 ; i

44、nt i = 3 ; p1 = & i ; p2 = & p1 ; p2 p1 3 i &p1 *p2 &i *p1p2 = & i ; / 非法, p2 必须取指针变量的地址cout * i ; / 非法, i 不是指针指向指针的指针87./ 例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指向指针的指针88.例5-8 指向指针的指针# include voi

45、d main ()int icount=18;int *iptr=&icount;*iptr=58;int *p;p=&iptr;cout*iptrendl;couticountendl;coutiptrendl;cout&icountendl;cout&iptrendl;coutpendl;89.void 指针变量能够存放任意内存地址。因为没有关联类型,编译器无法解释所指对象,程序中必须对其作强制类型转换,才可以按指定类型数据使用 5.1.6 指针的类型转换90.指针类型的强制转换 格式: (类型修饰符 *)指针表达式所有指针类型都可以赋给void指针而不需要类型转换,但是void指针不能直

46、接赋给另一个类型的指针。91./ 例5-9#includevoid main() int a = 65 ; int * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;指针的类型转换92./ 例5-9#includevoid main() int a = 65 ; int * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) v

47、p endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;定义无类型指针以整变量地址初始化指针的类型转换93./ 例5-9#includevoid main() int a = 65 ; int * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;强制类型转换后访问对象指针的类型转换94./ 例5-9#includevoid main() int a = 65 ; int

48、 * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;转换成字符型指针指针的类型转换1.5.3 指针变量与间址访问95./ 例5-9#includevoid main() int a = 65 ; int * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout

49、( * ip ) endl ;向整型指针赋值指针的类型转换96./ 例5-9#includevoid main() int a = 65 ; int * ip ; void * vp = &a ; cout * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;指针的类型转换1.5.3 指针变量与间址访问97./ 例5-10#includevoid main() int a = 321 ; /0 x141 int * ip ; void * vp = &a ; cout

50、 * ( int * ) vp endl ; cout * ( char * ) vp endl ; ip = ( int * ) vp ; cout ( * ip ) endl ;1.5.3 指针变量与间址访问98.单步执行:#includevoid main() coutshort: sizeof(short)endl;short i=259; /00000001 00000011/高位0 x01,低位0 x03 char *p=(char*) &i; coutint(*p)endl;p+;cout(*p)endl;99.指针在使用中必须类型匹配。# include void main (

51、)int icount=25;int* iptr=&icount;/*iptr=&icount;*iptr=50;*iptr的类型是整型,&icount的类型是整型指针5.1.7 指针类型的辨析100.在32位机器中,整型和指针都是4个字节,内存的表示方式也都是二进制整数,但指针和整型数表示的是不同的类型。指针和整型数可以进行强制类型转换。# include void main ()int icount=25;int* iptr=&icount;*iptr=(int)&icount;cout*iptr;101.第二节 指针在数组中的运算指针只可以进行加减运算。数组名本身(不包括方括号和下标),

52、它实际上是地址,表示数组起始地址。整型数组的数组名是一个整型地址,字符型数组的数组名是一个字符型地址。均可赋值给相应类型的指针。102.指针移动:移动n个单位 格式:指针变量+ =n 指针变量- =n 移动的实际字节数 n*sizeof(指针关联的类型)5.2.1 指针的基本操作103.指针移动:移动1个单位 格式: +指针变量 指针变量+ -指针变量 指针变量- 执行 int k,*pk=&k; coutendl+pk; coutendlpk; 显示的是两个相同的地址104. 执行 int k,*pk=&k; coutendlpk+; coutendlpk; 显示的是两个不同的地址105.指

53、针的基本操作正确理解下列组合操作的含义: *P+ (*p)+ *+p +*p106. *p+:取p所指向单元的数据作为表达式的值,然后使p指向下一个单元;369pd初始状态:执行*p+后369pd(*p+的值:3)107.(*p)+:取p所指向单元的数据作为表达式的值,然后使该单元的数据值增1;369pd初始状态:执行(*p)+后469pd(*p)+的值:3)108.*+p:使p指向下一个单元,然后取该单元的数据作为表达式的值;369pd初始状态:执行*+p后369pd(*+p的值:6)109.+*p:将p所指向单元的数据增1并作为表达式的 值;369pd初始状态:执行+*p后)469pd(+

54、*p的值:4110.# include void main ()int a4=10,20,30,40;int* p=a;cout*p+; coutendl(*p)+; coutendl*+p; coutendl+*pendl;coutendl;couta0endla1endla2endla3endl; 111.# include void main ()int a10;int sum=0;int* p=a; /int p=&a0;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + *p+;coutsum is sumendl;举例:112.#

55、include void main ()int a10;int sum=0;int* p=a; /int p=&a0;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + *p+;coutsum is sumendl;90113.# include void main ()int a10;int sum=0;int* p=a;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + *(p+);coutsum is sumendl;思考114.# include void main ()int a10;

56、int sum=0;int* p=a;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + *(p+);coutsum is sumendl;+和*的操作符优先级相同,他们是右结合的,所以*p+等价于*(p+)115.# include void main ()int a10;int sum=0;int* p=a;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + (*p)+;coutsum is sumendl;思考116.# include void main ()int a10;int su

57、m=0;int* p=a;for(int i=0;i10;i+)ai=2*i;for(i=0;i10;i+)sum=sum + (*p)+;coutsum is sumendl;45117.由于指针是具有某个数据类型的地址,所以指针运算都是以数据类型为单位展开的。32位机上整型变量占4字节,所以p+指向下一个整型变量,p的值实际加了4,而不是1。指针只有加减运算,没有乘除运算。记忆:118.# include void main ()int a5;int* p=&a1;p-;*p=3; p-; *p=5;思考119.# include void main ()int a5;int* p=&a0

58、;p-;*p=3; /a0=3p-; /error! p指向&a0前的未定义区*p=5; /damage! 编译不能检查出此错误 指针方式访问一维数组对于:int a100;int* p=a;ai 等价于 *(a+i) 等价于 pi 等价于 *(p+i)&ai 等价于 a+i 等价于 p+i 等价于 &pi121.以指针方式访问数组 a0a1a2a3a4a5a6a7a8a9a 0 x0065FDE40 x0065FDF0/ 例5-11#includevoid main() int a 10 = 1, 3, 5, 7, 9 ; cout Address of array a :

59、 a endl ; cout Address of element a3 : &a3 endl ;122.以指针方式访问数组 a0a1a2a3a4a5a6a7a8a9a 0 x0065FDE40 x0065FDF0/ 例5-11#includevoid main() int a 10 = 1, 3, 5, 7, 9 ; cout Address of array a : a endl ; cout Address of element a3 : &a3 endl ;数组名是存储空间首地址123.以指针方式访问数组 a0a1a2a3a4a5a6a7a8a9a 0 x0065FDE40 x0065

60、FDF0/ 例5-11#includevoid main() int a 10 = 1, 3, 5, 7, 9 ; cout Address of array a : a endl ; cout Address of element a3 : &a3 endl ;偏移值3 * sizeof ( int )124.以指针方式访问数组 数组名是隐含意义的指针常量(直接地址)其关联类型是数组元素的类型a = & a 0 a + 1 = & a 1 a + i = & a i *a = a 0 * ( a + 1 ) = a 1 * ( a + i ) = a i a0a1a2a3a4a5a6a7a8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论