C语言第7章指针第1讲.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C语言第7章指针第1讲.ppt》由会员分享,可在线阅读,更多相关《C语言第7章指针第1讲.ppt(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第7 7 7 7章章章章 指针指针指针指针(一一一一)12023/1/162内容提要内容提要 指针概述指针概述指针概述指针概述指针的概念指针的概念指针的概念指针的概念为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念为什么引入指针的概念指针变量作为函数参数指针变量作为函数参数指针变量作为函数参数指针变量作为函数参数字符指针作为函数参数字符指针作为函数参数字符指针作为函数参数字符指针作为函数参数 指针和数组间的关系指针和数组间的关系指针和数组间的关系指针和数组间的关系一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针一维数组的地址和指针二维数组的地址和指针二维数组的地址
2、和指针二维数组的地址和指针二维数组的地址和指针2023/1/163为什么引入指针的概念为什么引入指针的概念 铁杆铁杆铁杆铁杆C/C+C/C+程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针 C/C+C/C+的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针 很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成 2023/1/164为什么引入指针的概念为什么引入指针的概念 指针指针指针指针为函数提供修改变量值的手段为函数提供修改变量值的手段为函
3、数提供修改变量值的手段为函数提供修改变量值的手段 为为为为C C的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率 2023/1/165内存的寻址方式内存的寻址方式内存的寻址方式内存的寻址方式 如何读写内存中的数据?如何读写内存中的数据?如何读写
4、内存中的数据?如何读写内存中的数据?通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的存储单元存储单元存储单元存储单元 两种寻址方式两种寻址方式两种寻址方式两种寻址方式 直接(寻址)访问直接(寻址)访问直接(寻址)访问直接(寻址)访问通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容 间接(寻址)访问间接(寻址)访问间接(寻址)访问间接(寻址)访问通过指针变量来间接存取它所通过指针变量来间接存取它所通过指针变量来间接存取它所通过指针变量来间接存取它所指指指指向向向向的变量
5、的变量的变量的变量i i_pointer=&i;_pointer=&i;2023/1/166指针(指针(Pointer)的概念)的概念 指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型 指针变量指针变量指针变量指针变量 声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放地址数据地址数据地址数据地址数据的变量的变量的变量的变量 2023/1/167如何定义指针变量?如何定义指针变量?定义指针变量定义指针变量定义指针变量定义指针变量 intint*p;*p;定义了一个指针定义了一个指针定义了一个指
6、针定义了一个指针变量变量变量变量p p,简称指针,简称指针,简称指针,简称指针p p p p是变量,是变量,是变量,是变量,intint*是类型是类型是类型是类型 指针变量初始化指针变量初始化指针变量初始化指针变量初始化intint*p,a;*p,a;p=&a;p=&a;*p*p 与与与与 a a 完全完全完全完全等价等价等价等价2023/1/168指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值2023/1/169&与与*
7、操作符操作符&用来取变量的地址用来取变量的地址用来取变量的地址用来取变量的地址*用来取指针指向的内存中的内容用来取指针指向的内存中的内容用来取指针指向的内存中的内容用来取指针指向的内存中的内容int*p,a10;int*p,a10;p=&a0;p=&a0;*p=20;*p=20;int*p,a10;int*p,a10;p=&a5;p=&a5;*p=20;*p=20;int i=3,*p;int i=3,*p;p=&i;p=&i;printf(“*p=%d”,*p);printf(“*p=%d”,*p);int*p,a10;int*p,a10;p=a;p=a;*p=20;*p=20;等价于等价于
8、等价于等价于a0=20;a0=20;2023/1/1610指针变量与其它类型变量的对比指针变量与其它类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性 它的内容它的内容它的内容它的内容只能是地址只能是地址只能是地址只能是地址,而不能是数据,而不能是数据,而不能是数据,而不能是数据必须初始化必须初始化必须初始化必须初始化后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向
9、不确定的存储单元,后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、赋值赋值赋值赋值只能指向只能指向只能指向只能指向同一基类型同一基类型同一基类型同一基类型的变量的变量的变量的变量2023/1/1611指针的指向指针的指向 只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将
10、引起只能指向同一基类型的变量,否则将引起只能指向同一基类型的变量,否则将引起warningwarningfloatfloat x;x;intint *p=&x;*p=&x;TCTC编译编译编译编译 warning:Suspicious pointer conversion in warning:Suspicious pointer conversion in function mainfunction mainVCVC编译编译编译编译 warning C4133:=:incompatible types-from warning C4133:=:incompatible types-from
11、float*to int*float*to int*2023/1/1612指针运算指针运算 算术运算算术运算算术运算算术运算 shortshort*p,a10;*p,a10;p=a;p=a;p+;p+;/*p/*p的值增加多少?的值增加多少?的值增加多少?的值增加多少?*/指针的加减运算是以指针的加减运算是以指针的加减运算是以指针的加减运算是以其指向的其指向的其指向的其指向的类型的字节长度类型的字节长度类型的字节长度类型的字节长度为单位的为单位的为单位的为单位的6000600160026003600460056006p-1pp+12023/1/1613指针运算指针运算 intint*p,*q,
12、a10;*p,*q,a10;p=a;p=a;q=&a5;q=&a5;q-p q-p q=p+5;q=p+5;指针运算不能乱算指针运算不能乱算指针运算不能乱算指针运算不能乱算一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之一般只进行指针和整数的加减运算,同类型指针之间的减法运算间的减法运算间的减法运算间的减法运算其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不
13、支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持的加法等,并无意义,所以也不支持2023/1/1614指针运算指针运算 关系运算关系运算关系运算关系运算 指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算指向同一种数据类型的两个指针才能进行关系运算值为值为值为值为1 1或或或或0 0 p q p q p q p=q 不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与不能与非指针类型变量进行比较,但可与NULL(NULL(即即即即0 0值
14、值值值)进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算进行等或不等的关系运算判断判断判断判断p p是否为空指针是否为空指针是否为空指针是否为空指针P=NULLP=NULLp!=NULLp!=NULL2023/1/1615指针运算指针运算 赋值赋值赋值赋值运算运算运算运算 指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值指针在使用前一定要赋值 为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址为指针变量赋的值必须是一个地址mainmain()()intint*p;*p;scanf(%d,p);scanf(%d,p);m
15、ainmain()()intint a,*p=&a;a,*p=&a;scanf(%d,p);scanf(%d,p);错!但TC下不报错VC下报错2023/1/1616指针与函数指针与函数 指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值指针既然是数据类型,自然可以做函数参数和返回值的类型的类型的类型的类型 指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:指针做函数参数的经典例子:两数的互换两数的互换两数的互换两数的互换2023/1/1617void Swap(int*x,in
16、t*y)int temp;temp=*x;*x=*y;*y=temp;main()int a,b;a=15;b=8;Swap(&a,&b);printf(a=%d,b=%d,a,b);void Swap(int x,int y)void Swap(int x,int y)int temp;int temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;main()int a,b;a=15;b=8;Swap(a,b);printf(a=%d,b=%d,a,b);程序程序 1程序程序 2 例7.17.2:编写函数实现两数的互换主调函数主调函数被调被调函数函数实实 参参形形
17、 参参结果有何不同?结果有何不同?2023/1/1618主调函数主调函数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(Swap(a,ba,b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint x,x,intint y y)intint temp;temp;temp=x;temp=x;x=y;x=y;y=temp;y=temp;55ab实实 参参形形 参参99xyab程序程序 1xy55temp92023/1/1619主调函数主调函
18、数被调函数被调函数main()main()intint a,b;a,b;a=15;a=15;b=8;b=8;Swap(&Swap(&a,&ba,&b););printf(a=%d,b=%d,a,b);printf(a=%d,b=%d,a,b);voidvoid Swap(Swap(intint*x,*x,intint*y*y)intint temp;temp;temp=*x;temp=*x;*x=*y;*x=*y;*y=temp;*y=temp;&a&a实实 参参形形 参参&b&bxyab程序程序 2xy5temp5ab9952023/1/1620简单变量作函数参数与简单变量作函数参数与简单变
19、量作函数参数与简单变量作函数参数与指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较指针变量作函数参数的比较15 815 815 81515 8815 81515a)调用Swap函数(b)执行Swap函数c)从Swap函数返回temp xy bmain函数Swap函数aaatemptempxxy y bb1588 15&a&b&a&b15(a)调用Swap函数 (b)执行Swap函数 a a b b *x *x *y *y y y x x&a&b main函数 Swap函数 temptemp2023/1/1621swap函数的几种错误形式函数的几种错误形式(1/31/3)
20、参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint x,x,intint y)y)intint temp;temp;temp=x;temp=x;/*x,y/*x,y为内部变量为内部变量为内部变量为内部变量*/x=y;x=y;y=temp;y=temp;2023/1/1622swap函数的几种错误形式函数的几种错误形式(2/32/3)参数单向传递参数单向传递参数单向传递参数单向传递voidvoid Swap(Swap(intint*p1,*p1,intint*p2)*p2)intint*p;*p;p=p1;p=p1;/*p1,p2/*p1,p2为内
21、部变量为内部变量为内部变量为内部变量*/p1=p2;p1=p2;p2=p;p2=p;2023/1/1623swap函数的几种错误形式函数的几种错误形式(3/33/3)指针指针指针指针p p没有确切地址没有确切地址没有确切地址没有确切地址voidvoid Swap(Swap(intint*p1,*p1,int int*p2)*p2)intint*p;*p;/*/*指针指针指针指针p p未初始化未初始化未初始化未初始化*/*p=*p1;*p=*p1;*p1=*p2;*p1=*p2;*p2=*p;*p2=*p;2023/1/1624字符串与字符数组、字符指针字符串与字符数组、字符指针 C C语言并没
22、有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理使用字符数组和字符指针来处理 字符串字符串字符串字符串一串以一串以一串以一串以00结尾的字符结尾的字符结尾的字符结尾的字符 字符数组字符数组字符数组字符数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组 charchar string100;string100;字符指针字符指针字符指针字符
23、指针指向字符类型的指针指向字符类型的指针指向字符类型的指针指向字符类型的指针 char char*p;*p;数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事2023/1/1625字符指针变量与字符数组的区别字符指针变量与字符数组的区别 定义方法不同定义方法不同定义方法不同定义方法不同 chcharar str10;str10;chcharar*ptr;*ptr;赋值方法不同赋值方法不同赋值方法不同赋值方法不同 chcharar str10;str10;str=
24、”china”;str=”china”;/*/*错误错误错误错误*/strcpy(str,”china”);strcpy(str,”china”);/*/*正确正确正确正确*/chcharar*ptr;*ptr;ptr=”china”;ptr=”china”;字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量2023/1/1626使用字符指针的注意事项使用字符指针的注意事项 字符指针变量必须有明确的指向,否则字符指针变量必须有明确的指向,否则使用使用是危险的是危险的 例如,输入字符串时例如,输入字符串时例如,
25、输入字符串时例如,输入字符串时 char char*a;*a;scanf(%s,a);scanf(%s,a);/*/*错误错误错误错误*/应为:应为:应为:应为:char char*a;*a;char char str10;str10;a=str;a=str;scanf(%s,a);scanf(%s,a);/*/*正确正确正确正确*/2023/1/1627例例7.5:字符串拷贝:字符串拷贝用字符数组编程用字符数组编程void void MyStrcpy(MyStrcpy(charchar dstStr,dstStr,charchar srcStr)srcStr)intint i=0;i=0;w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内