C语言程序设计第九章善于利用指针.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语言程序设计第九章善于利用指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第九章善于利用指针.ppt(66页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 C程序设计程序设计主讲人:袁丽主讲人:袁丽燕大里仁基础教学部第九章:善于利用指针第九章:善于利用指针1 指针的概念和指针变量指针的概念和指针变量2 数组指针和指向数组的指针变量数组指针和指向数组的指针变量3 字符串指针和指向字符串的指针变量字符串指针和指向字符串的指针变量4 指针数组和指向指针的指针指针数组和指向指针的指针5 指针小结指针小结 地址指针的基本概念地址指针的基本概念一、指针变量一、指针变量 如何定义指针变量如何定义指针变量 如何引用指针变量如何引用指针变量 指针变量作为函数参数指针变量作为函数参数引:指针是什么引:指针是什么u如果在程序中定义了一个变量,在对程序进行编译时,系如
2、果在程序中定义了一个变量,在对程序进行编译时,系统就会给统就会给该该变量分配内存单元变量分配内存单元u编译系统根据程序中定义的变量类型,分配一定长度的空编译系统根据程序中定义的变量类型,分配一定长度的空间间u例如,例如,VC+VC+为整型变量分配为整型变量分配4 4个字节,对单精度浮点型变个字节,对单精度浮点型变量分配个字节,对字符型变量分配个字节量分配个字节,对字符型变量分配个字节n务必弄清楚存储单元的务必弄清楚存储单元的地址地址和存储单元的和存储单元的内容内容这两个概这两个概念的区别念的区别例如:例如:u内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地址地址”,
3、它相当,它相当于旅馆中的房间号。于旅馆中的房间号。u在地址所标在地址所标识识的内存单元中存放数据,这相当于旅馆房间中的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。居住的旅客一样。u由于通过地址能找到所需的变量单元,我们可以说,地址指由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。向该变量单元。将地址形象化地称为将地址形象化地称为“指针指针”int i=3,j=6,k;int i=3,j=6,k;printf(“%d”,i);printf(“%d”,i);通过变量名通过变量名i找到找到i的地址的地址2000,从而从存,从而从存储单元读取储单元读取3int i=3,j=
4、6,k;int i=3,j=6,k;k=i+j;k=i+j;从这里取从这里取3将将9送到这里送到这里从这里取从这里取6直接存取直接存取int i=3,j=6,k;int i=3,j=6,k;定义特殊变量定义特殊变量i_pointeri_pointer将将i的地址的地址存到这里存到这里间接存取间接存取i_pointer=&i;i_pointer=&i;*i_pointer=*i_pointer=5050;5050i i200032000i_pointeri_pointer*i_pointer*i_pointer20003直接存取直接存取间接存取间接存取为了表示将数值送到变量中,可以有两种表达方法
5、:为了表示将数值送到变量中,可以有两种表达方法:(1)(1)将将3 3直接送到变量直接送到变量i i所标识的单元中,例如:所标识的单元中,例如:i=3;i=3;(2)(2)将将3 3送到变量送到变量i_pointeri_pointer所指向的单元(即变量所指向的单元(即变量i i的存储单的存储单元),例如:元),例如:*i_pointer=3;*i_pointer=3;其中其中*i_pointer*i_pointer表示表示i_pointeri_pointer指向指向的对象的对象指向就是通过地址来体现的指向就是通过地址来体现的假设假设i_pointeri_pointer中的值是变量的地址中的值
6、是变量的地址(2000)(2000),这样就在,这样就在i_pointeri_pointer和变量之间建立起一种联系,即通过和变量之间建立起一种联系,即通过i_pointeri_pointer能知道能知道i i的地址,从而找到变量的地址,从而找到变量i i的内存单元的内存单元由于通过地址能找到所需的变量单元,因此说,地址指由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元向该变量单元将地址形象化地称为将地址形象化地称为“指针指针”。意思是通过它能找到以。意思是通过它能找到以它为地址的内存单元它为地址的内存单元一个变量的一个变量的地址地址称为该变量的称为该变量的“指针指针”例如,地址例
7、如,地址20002000是变量的指针是变量的指针如果有一个变量专门用来存放另一变量的地址(即指针),如果有一个变量专门用来存放另一变量的地址(即指针),则它称为则它称为“指针变量指针变量”i_pointeri_pointer就是一个指针变量。指针变量就是地址变量,用来就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针)存放地址的变量,指針变量的值是地址(即指针)“指针指针”和和“指针变量指针变量”是是不同的不同的概念概念可以说变量可以说变量i i的指针是的指针是20002000,而不能说,而不能说i i的指针变量是的指针变量是20002000指针是一个地址,
8、而指针变量是存放地址的变量指针是一个地址,而指针变量是存放地址的变量定义指针变量定义指针变量定义指针变量的一般形式为:定义指针变量的一般形式为:类型类型 *指针变量名指针变量名;其中,其中,*表示这是一个指针变量,变量名即为定义的指针变表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型量名,类型说明符表示本指针变量所指向的变量的数据类型如:如:int*pointer_1,*pointer_2;int*pointer_1,*pointer_2;uintint是是为为指针变量指定的指针变量指定的“基类型基类型”u基类型指定指针变量可指向的变量类型基类型
9、指定指针变量可指向的变量类型u如如pointer_1pointer_1可以指向整型变量,但不能指向浮点型变量可以指向整型变量,但不能指向浮点型变量如:如:int*p1;int*p1;表示表示p1p1是一个指针变量,它的值是某个整型变量的地址。是一个指针变量,它的值是某个整型变量的地址。或者说或者说p1p1指向一个整型变量。至于指向一个整型变量。至于p1p1究竟指向哪一个整型变量,究竟指向哪一个整型变量,应由向应由向p1p1赋予的地址来决定赋予的地址来决定。引用指针变量引用指针变量n在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:给指针变量赋值。如:给指针变量赋值。如:p=&
10、a;p=&a;引用指针变量指向的变量引用指针变量指向的变量。如如有有 p=&a;*p=1;p=&a;*p=1;则执行则执行printf(“%d”,*p);printf(“%d”,*p);将输出将输出1 1引用指针变量的值。如:引用指针变量的值。如:printf(“%o”,p);printf(“%o”,p);使使p指向指向a*p相当于相当于a以八进制输以八进制输出出a的地址的地址要熟练掌握两个有关的运算符:要熟练掌握两个有关的运算符:(1)(1)取地址运算符。取地址运算符。&a&a是变量是变量a a的地址的地址(2)*(2)*指针运算符(指针运算符(“间接访问间接访问”运算符)运算符)如果如果:
11、p p指向变量指向变量a a,则则*p p就代表就代表a a。k=*p;(k=*p;(把把a a的值的值赋给赋给k)k)*p=1;(*p=1;(把把1 1赋给赋给a)a)设有指向整型变量的指针变量设有指向整型变量的指针变量p p,如要把整型变量,如要把整型变量a a 的地址赋予的地址赋予p p可以有以下两种方式:可以有以下两种方式:1.1.指针变量初始化的方法指针变量初始化的方法 int a;int a;int*p=&a;int*p=&a;2.2.赋值语句的方法赋值语句的方法 int a;int a;int*p;int*p;p=&a;p=&a;注:注:1.1.不允许把一个数赋予指针变量,故下面
12、的赋值是错误的:不允许把一个数赋予指针变量,故下面的赋值是错误的:int*p;int*p;p=1000;p=1000;2.2.被赋值的指针变量前不能再加被赋值的指针变量前不能再加“*”*”说明符,说明符,如写为如写为*p=&a*p=&a 也是错误的。也是错误的。假设假设:int i=200,x;int i=200,x;int*ip;int*ip;我们定义了两个整型变量我们定义了两个整型变量i,x,i,x,还定义了一个指向整型数的指针变量还定义了一个指向整型数的指针变量ip ip。i,xi,x中可存放整数中可存放整数,而而ip ip中只能存放整型变量的地址。我们可以把中只能存放整型变量的地址。我
13、们可以把i i的的地址赋给地址赋给ip:ip=&i;ip:ip=&i;此时指针变量此时指针变量ip ip指向整型变量指向整型变量i,i,假设变量假设变量i i的地址为的地址为1800,1800,这个赋值这个赋值可形象理解为下图所示的联系。可形象理解为下图所示的联系。以后我们便可以通过指针变量以后我们便可以通过指针变量ip ip间接访问变量间接访问变量i,i,例如例如:x=*ip;x=*ip;运算符运算符*访问以访问以ip ip为地址的存储区域为地址的存储区域,而而ip ip中存放的是变量中存放的是变量i i的地址的地址,因此因此,*ip,*ip访问的是地址为访问的是地址为18001800的存储
14、区域的存储区域(因为是整数因为是整数,实际上是从实际上是从18001800开始的两开始的两个字节个字节),),它就是它就是i i所占用的存储区域所占用的存储区域,所以上面的赋值表达式等价于所以上面的赋值表达式等价于 x=i;x=i;另外另外,指针变量和一般变量一样指针变量和一般变量一样,存放在它们之中的值是可以改变的存放在它们之中的值是可以改变的,也就是说可以改变它们的指向也就是说可以改变它们的指向,假设假设int i,j,*p1,*p2;int i,j,*p1,*p2;i=a;i=a;j=b;j=b;p1=&i;p1=&i;p2=&j;p2=&j;则建立如下图所示的联系则建立如下图所示的联系
15、:这时赋值表达式这时赋值表达式:p2=p1p2=p1就使就使p2p2与与p1p1指向同一对象指向同一对象i,i,此时此时*p2*p2就等价于就等价于i,i,而不是而不是j,j,图所示图所示:如果执行如下表达式如果执行如下表达式:*p2=*p1;*p2=*p1;则表示把则表示把p1p1指向的内容赋给指向的内容赋给p2p2所指的区域所指的区域,此时就变成图所示此时就变成图所示:例:例:输入输入a a和和b b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a a和和b b。n解题思路:用指针方法来处理这个问题。不交换整型变量解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交
16、换两个指针变量的值。的值,而是交换两个指针变量的值。#include#include int main()int main()int*p1,*p2,*p,a,b;int*p1,*p2,*p,a,b;printf(“integer numbers:);printf(“integer numbers:);scanf(“%d,%d”,&a,&b);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;p1=&a;p2=&b;if(ab)if(ab)p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b
17、=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);printf(“%d,%dn”,*p1,*p2);return 0;return 0;abp1p2p59&a&b成立成立#include#include int main()int main()int*p1,*p2,*p,a,b;int*p1,*p2,*p,a,b;printf(“integer numbers:);printf(“integer numbers:);scanf(“%d,%d”,&a,&b);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;p1=&a;p2=&b;if(ab)if(ab)p
18、=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);printf(“%d,%dn”,*p1,*p2);return 0;return 0;abp1p2p59&a&b&b&a#include#include int main()int main()int*p1,*p2,*p,a,b;int*p1,*p2,*p,a,b;printf(“integer numbers:);printf(“integer numbers:);scanf(“%d
19、,%d”,&a,&b);scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;p1=&a;p2=&b;if(ab)if(ab)p=p1;p1=p2;p2=p;p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);printf(“%d,%dn”,*p1,*p2);printf(“%d,%dn”,*p1,*p2);return 0;return 0;abp1p2p59&a&b&b&a注意注意:ua a和和b b的值并未交换,它们仍保持原值的值并未交换,它们仍保持原值u但但p1p1和和p2p2的值改变了。的值改
20、变了。p1p1的值原为的值原为&a&a,后来变成,后来变成&b&b,p2p2原值为原值为&b&b,后来变成,后来变成&a&au这样在输出这样在输出*p1*p1和和*p2*p2时,实际上是输出变量时,实际上是输出变量b b和和a a的值,的值,所以先输出所以先输出9 9,然后输出,然后输出5 5指针变量作为函数参数指针变量作为函数参数例例:题目要求同上例,即对输入的两个整数按大小顺序输出。题目要求同上例,即对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。现用函数处理,而且用指针类型的数据作函数参数。解题思路:定义一个函数解题思路:定义一个函数swapswap,将指向
21、两个整型变量的指针变量作为实参传,将指向两个整型变量的指针变量作为实参传递给递给swapswap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。函数的形参指针变量,在函数中通过指针实现交换两个变量的值。#include#include int main()int main()void swap(int*p1,int*p2);void swap(int*p1,int*p2);int a,b;int*pointer_1,*pointer_2;int a,b;int*pointer_1,*pointer_2;printf(please enter a and b:);printf(plea
22、se enter a and b:);scanf(“%d,%d”,&a,&b);scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_1=&a;pointer_2=&b;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);if(ab)swap(pointer_1,pointer_2);printf(“max=%d,min=%dn”,a,b);printf(“max=%d,min=%dn”,a,b);return 0;return 0;pointer_1a&a5pointer_2b&b9void swap(int*p1,int*
23、p2)void swap(int*p1,int*p2)int temp;int temp;temp=*p1;temp=*p1;*p1=*p2;*p1=*p2;*p2=temp;*p2=temp;abpointer_159&a&bpointer_2p1&ap2&b95n如果想通过函数调用得到个要改变的值:如果想通过函数调用得到个要改变的值:在主调函数中设个变量,用个指针变量指向它们在主调函数中设个变量,用个指针变量指向它们 设计一个函数,有设计一个函数,有n n个指针形参。在这个函数中改变这个指针形参。在这个函数中改变这个形参的值个形参的值 在主调函数中调用这个函数,在调用时将这在主调函数中调用
24、这个函数,在调用时将这n n个指针变个指针变量作实参,将它们的地址传给该函数的形参量作实参,将它们的地址传给该函数的形参 在执行该函数的过程中,通过形参指针变量,改变它在执行该函数的过程中,通过形参指针变量,改变它们所指向的个变量的值们所指向的个变量的值主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量n注意:函数的调用可以(而且只可以)得到一个返回值(即注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。值。如果不用指针变量
25、是难以做到这一点的。n要善于利用指针法。要善于利用指针法。例:输入例:输入3 3个整数个整数a,b,ca,b,c,要求按由大到小的顺序将它们输出。用,要求按由大到小的顺序将它们输出。用函数实现。函数实现。#include int main()void exchange(int*q1,int*q2,int*q3);int a,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“%d,%d,%dn,a,b,c);return 0;调用结束后不会调用结束后不会改变指针的指向改变指针
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第九 善于 利用 指针
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内