九章指针ppt课件教案.ppt
《九章指针ppt课件教案.ppt》由会员分享,可在线阅读,更多相关《九章指针ppt课件教案.ppt(111页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院九章指针ppt课件 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针是是C C语言中最重要的组成部分。利语言中最重要的组成部分。利用用指针指针可以表示可以表示 复杂的数据结构;动态分复杂的数据结构;动态分配内存;灵活处理字符串和数组;直接处配内存;灵活处理字符串和数组;直接处理内存地址;
2、理内存地址;从函数调用中获取多个值等。从函数调用中获取多个值等。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院对变量值的存取实质上是通过对变量值的存取实质上是通过地址地址进行的。进行的。示意图示意图9.1 指针的概念指针的概念 C语言中,任何一个语言中,任何一个变量名变量名实质上都代表着内实质上都代表着内存中的某一个存储单元,每一个存储单元都有一个存中的某一个存储单元,每一个存储单元都有一个地址地址。C系统能自动将系统能自动将变量名变量名和它的和它的地址地址联系起来。联系起来。变量定义及内存分配实例变量定义及内存分配实例对变量的两种访问方式:对变量的两种
3、访问方式:直接访问直接访问 和和间接访问间接访问inti,j,k;i=3;j=6;k=9;则编译时系统分别为则编译时系统分别为i,j,k各分配各分配2个字节。个字节。如如:2000,2001i2002,2003j2004,2005k例例例例图图图图 内存用户数据区内存用户数据区36920002000200220043010 变量变量 i变量变量 j变量变量 k变量变量 i_ pointer如如:inti=3;printf(“%d”,i);执行是执行是:根据变量名根据变量名i找到找到i的地址的地址(如如:2000),然后,然后从地址从地址2000开始的两开始的两个字节中取出数据个字节中取出数据(
4、即变量的值即变量的值3),再将再将其输出。这种据变量名按变量地址存取变其输出。这种据变量名按变量地址存取变量的值的量的值的方式叫方式叫“直接访问直接访问”方式。方式。说明说明说明说明重点重点重点重点2000i3inti=3;表示将表示将3送送到变量到变量i所占的内存单元中所占的内存单元中重点重点重点重点C语言允许定义和使用一种特殊的变量,语言允许定义和使用一种特殊的变量,这种变量专门用于存放其它变量的这种变量专门用于存放其它变量的地址地址。如前。如前面的变量面的变量i_pointer。如。如果把变量果把变量i的地址赋的地址赋给给i_pointer,即即i_pointer=&i。这。这样就样就可
5、以通过变量可以通过变量i_pointer获取变量获取变量i的地址,的地址,然后再然后再取出取出i的值。这种方式叫的值。这种方式叫“间接访问间接访问”方式。方式。如图所示如图所示:20002000i_pointer3将将3送到变量送到变量i_pointer所所指向指向的内存单元中的内存单元中C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 指针指针:一个变量的一个变量的地址地址叫该变量的叫该变量的“指针指针”。指针变量指针变量:用于存放其它变量的用于存放其它变量的地址地址的变量。的变量。指向指向:如如 i_pointer=&ii_pointer=&i ,就称
6、,就称i_pointeri_pointer指向变量指向变量i i 目标变量目标变量:指针变量所指向的变量。指针变量所指向的变量。有关指针的几个概念:有关指针的几个概念:C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.类型说明符类型说明符表示指针变量所指向的变量的类型,表示指针变量所指向的变量的类型,同类型变量的地址才能放到指向该类型变量的指针同类型变量的地址才能放到指向该类型变量的指针变量中。变量中。例如例如2.不能把一个不能把一个整型量整型量或任何其它或任何其它非地址非地址类型的数据类型的数据赋给一个指针变量。赋给一个指针变量。例如例如示例
7、一示例一实例二实例二9.2变量的变量的指针指针和指向变量的和指向变量的指针变量指针变量一、指针变量的定义一、指针变量的定义格式格式:类型说明符类型说明符*标识符标识符如:如:int*pointer_1,*pointer_2;float*fp1,*fp2;例例例例例例例例&i&jpointer_1pointer_2ij如如:inti,j,*pointer_1,*pointer_2;若若:pointer_1=&i;pointer_2=&j;则则:flaotf1;int*p;p=&f1;(不正确不正确)例例例例如如:int*p;p=100;(不合法不合法)但但:p=NULL或或p=0或或p=0则是合
8、法则是合法的,都表示为指的,都表示为指针赋了针赋了“空值空值”。这并不意味着这并不意味着p指指向向地址为地址为0的单元,而是不指向的单元,而是不指向任何单元,但任何单元,但p中有确定的值。中有确定的值。例例例例C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、指针变量的引用二、指针变量的引用例例9.1main()inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%dn”,a,b);printf(“%d,%dn”,*p1,*p2);结果结果:100,10100,10&a&b10010p1p2ab*p1*
9、p2“直接访问直接访问”方方式式“间接访问间接访问”方方式式C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符。是取地址运算符。例如例如2.&,*,+,同优先级,同优先级,按从按从右至左方右至左方向结合。向结合。示例示例1 示例示例2 示例示例3如如:inta,*p1,*p2;p1=&a;则则:&*p1与与&a等效等效p2=&*p1;或或p2=&a;则则:p2也指向变量也指向变量a例子例子例子例子如如:&a,&b等。等。*是指针运算符。是指针运算符。用于定义时用于定义时表示其后的表示其后的标识符标
10、识符是是指针变量指针变量。而。而在程序中在程序中*p则表示指针变量则表示指针变量p所指所指向的变量,即向的变量,即目标变量目标变量。例子例子例子例子例子例子例子例子如如:inta,*p1;p1=&a;则则:*&a与与*p1等效,即等价于变量等效,即等价于变量a。&ap1*p1*&aa如如:inta,*p1;p1=&a;则则:(*p1)+等价于等价于a+但注意但注意*p1+不等价于不等价于(*p1)+因为因为*p1+等价于等价于*(p1+)即先得即先得p1所指向变量的所指向变量的值值,再使指针变量,再使指针变量p1的值自增。的值自增。例子例子例子例子C语语言言程程序序设设计计第第九九章章四川理工
11、学院四川理工学院四川理工学院四川理工学院例例9.2main()int*p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9max=9,min=5数据指针交换示意图数据指针交换示意图 注意事项注意事项进行地址交换进行地址交换本程序是采用交换变量本程序是采用交换变量a和和b的地址来实现两个数的地址来实现两个数的比较的。且比较前后的比较的。且比较前后a,b
12、的值并未发生变化的值并未发生变化重点重点重点重点重点重点重点重点&a&b59&b&a95p1p2ppp1p2abab交换前交换前交换后交换后C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院三、三、指针变量作为函数的参数指针变量作为函数的参数函数调用时,把实际参数的值传递给形式参数。函数调用时,把实际参数的值传递给形式参数。指针变量可以作实际参数,其作用也是将实际参数指针变量可以作实际参数,其作用也是将实际参数的值传递给形式参数,这个时候的值代表是将一个变的值传递给形式参数,这个时候的值代表是将一个变量的量的地址,地址,把把地址地址传送给被调函数的形式参数。
13、传送给被调函数的形式参数。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院例例9.3swap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);交换目标变量,即值的交换交换目标变量,即值的交换C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工
14、学院四川理工学院若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2&a&b&a&b59abp1p2pointer_1pointer_2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2(a)(b)(c)(d)本程序采用的是交换本程序采用的是交换a和和b的的值值,而而p1和和p2的值不变。的值不变。同同例例9.2相反相反C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院如果把如果把swap函数改成函数改成:swap(int*p1,int*p2)in
15、t*p;*p=*p1;*p1=*p2;*p2=*p;此句有问此句有问题题C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(intx,inty)intt;t=x;x=y;y=t;55995995abxyabxy(a)(b)main()inta,b;scanf(“%d,%d”,&a,&b);if(ab)swap(a,b);printf(“n%d,%dn”,a,b);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院说明说明:1.如想通过函数调用得到如想通过函数调用得到n个要改变的值。个要改变的值。(1)在主调函数中设
16、在主调函数中设n个变量,并用个变量,并用n个指针变量个指针变量指向它们。指向它们。(2)将指针变量作将指针变量作实参实参,使,使n个变量的个变量的地址地址传给所传给所调用的函数调用的函数形参形参。(3)通过形参指针变量,改变该通过形参指针变量,改变该n个变量的个变量的值值。(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。2.不能通过改变形参指针变量不能通过改变形参指针变量本身的值本身的值而使而使实参指实参指针变量的值针变量的值改变。改变。&ap1&aq1函数调用时函数调用时&bq1在被调函数中在被调函数中C语语言言程程序序设设计计第第九九章章四川理工学院四
17、川理工学院四川理工学院四川理工学院3.可以通过改变形参指针变量所可以通过改变形参指针变量所指向指向的变量的值来改的变量的值来改变实参指针变量所变实参指针变量所指向指向的变量的值。的变量的值。5a&ap1&aq1补例补例1:voidpoint(int*q1)q1+=2;main()int*p1,a=4;p1=&a;point(p1);printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院4a&ap1&aq1补例补例2:voidpoint(int*q1)*q1+=2;main()int*p1,a=4;p1=&a;point(p1)
18、;printf(“%dn”,*p1);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;main()inta,b,*pointer_1,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%dn”,a,b);本函数中试图通过改变本函数中试图通过改变形参指针变形参指针变量量的值来使的值来使实参指针变量实参指针变量的值改变的值改变C
19、语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院a&a&b59bpointer_1pointer_2(a)&a&b59abp1p2(b)&b&a59abp1p2(c)a&b&a59bpointer_1pointer_2(d)&a&b59abpointer_1pointer_2(d)C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);例例
20、9.4swap(int*pt1,int*pt2)intp;p=*pt1;*pt1=*pt2;*pt2=p;C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院main()inta,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“n%d,%d,%dn”,a,b,c);运行如下运行如下:9,0,10:9,0,10 10,9,0 10,9,C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院C语语言言程程序
21、序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院 9.3 9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C C 语言中,指针变量可以指向变量,也可以指向语言中,指针变量可以指向变量,也可以指向数组数组和和数组元素数组元素。数组的指针数组的指针:数组的数组的起始地址起始地址(首地址首地址 )数组元素的指针数组元素的指针:数组元素的地址数组元素的地址C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院一、指向一维数组的指针变量的定义与赋值一、指向一维数组的指针变量的定义与赋值指向数组的指针变量的定义同指向变量的指针变量
22、的指向数组的指针变量的定义同指向变量的指针变量的定义相同。定义相同。如如:inta10;int*p;若若:p=&a0;则则p指向了指向了a数组的第数组的第0号元素。号元素。由于数组名代表数组的由于数组名代表数组的首地址首地址(即即起始地址起始地址),故故:p=&a0;等价于等价于p=a;也可也可:inta10;int*p=&a0;int*p=a;注意注意int*p=&a0;的含义是将数组的的含义是将数组的首地址首地址赋给赋给指针变量指针变量p,而不是赋给,而不是赋给(*p)。C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院二、二、通过指针引用数组元素通过指
23、针引用数组元素如如:inta10,*p;p=a;则则:(1)pa0的地址的地址p+1a1的地址的地址p+iai的地址的地址(2)*p=a0,*(p+1)=a1,*(p+i)=ai说明说明:1.数组元素在内存中是连续存放的,数组元素在内存中是连续存放的,C语言规定,语言规定,指针变量指针变量p+1指向下一个元素指向下一个元素(不不是简单的加是简单的加1)如数组元素为实型,如数组元素为实型,则则p+1所表示的实所表示的实际地址是际地址是p+1 d=p+1 4(d为一个数组元素所为一个数组元素所占的字节数占的字节数)&C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工
24、学院2.(p+i)表示指向表示指向ai的地址,而的地址,而a+i也表示也表示ai的地址,故的地址,故程序中程序中(p+i)等价于等价于a+i。如如:p+2;a+2;3.指向数组的指针变量可以带下标。指向数组的指针变量可以带下标。如如:pi*(p+i)综上所述综上所述:数组元素的引用可以数组元素的引用可以:(1)下标法下标法:数组名数组名下标下标或或指针变量名指针变量名下标下标(2)指针法指针法:*(p+i)或或*(a+i)(假定假定:inta10,*p=a;)a数组数组pp+1,a+1p+i,a+ip+9,a+9a0a1aia9*(p+i)C语语言言程程序序设设计计第第九九章章四川理工学院四川
25、理工学院四川理工学院四川理工学院例例9.5用三种方法输出数组各元素。用三种方法输出数组各元素。(1)下标法下标法main()inta10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,ai);C语语言言程程序序设设计计第第九九章章四川理工学院四川理工学院四川理工学院四川理工学院(2)用数组名计算元素地址用数组名计算元素地址main()inta10,i;for(i=0;i10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i10;i+)printf(“%d”,*(a+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 ppt 课件 教案
限制150内