10 [兼容模式].pdf
《10 [兼容模式].pdf》由会员分享,可在线阅读,更多相关《10 [兼容模式].pdf(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章 指针指针第十章第十章 指针指针?10.1 地址和指针的概念10.1 地址和指针的概念?10.2 变量的指针和指向变量的指针变量10.2 变量的指针和指向变量的指针变量?10.310.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量?10.310.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量?10.4 字符串的指针和指向字符串的指针变量10.4 字符串的指针和指向字符串的指针变量10 510 5 函数的指针和指向函数的指针函数的指针和指向函数的指针?1010.5 5 函数的指针和指向函数的指针函数的指针和指向函数的指针?10.6 返回指针值的函数
2、10.6 返回指针值的函数10 1 地址和指针的概念地址和指针的概念10.1 地址和指针的概念地址和指针的概念一一.地址与指针地址与指针1.地址与取地址运算地址与取地址运算C程序中的变量在内存中占有一个可标识的存储区程序中的变量在内存中占有一个可标识的存储区,每一个存储区是由若干个字节组成每一个存储区是由若干个字节组成,每一个字节都有自己的地址每一个字节都有自己的地址,而一个存储区的 地址是指该存储区中而一个存储区的 地址是指该存储区中,第一个字节的地址第一个字节的地址C语言允许在程序中使用变量的地址语言允许在程序中使用变量的地址(通过通过地址运算符地址运算符&可得到可得到)如如:float
3、x;变量变量 x 的地址的地址-&x int a10;数组变量数组变量 a 的地址的地址-数组名数组名 a 2.指针与指针变量指针与指针变量(1)变量的访问方式变量的访问方式(1)变量的访问方式变量的访问方式 直接访问 直接访问:通过变量名或地址访问变量的存储区通过变量名或地址访问变量的存储区例例:scanf(“%d”&x);例例:scanf(“%d”,&x);x=sqrt(x);printf(“%d”x);printf(%d ,x);间接访问 间接访问:将一个变量的地址存放在另一个变量中将一个变量的地址存放在另一个变量中如将变量如将变量的地址存放在的地址存放在20121010如将变量如将变量
4、 x 的地址存放在的地址存放在变量变量p 中中,访问访问x 时先找到时先找到p,再由再由p 中存放的地址找到中存放的地址找到 x201210101010再由再由p 中存放的地址找到中存放的地址找到 xpx(2)指针指针:一个一个变量的指针就是该变量的地址变量的指针就是该变量的地址(指针就是地址指针就是地址)变变如如变变量量x的指针为的指针为1010。(3)指针变量指针变量:存放某个变量的地址的变量存放某个变量的地址的变量,它用来指向另一它用来指向另一个变量。如个变量。如p10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量一一、指针变量的定义指针变量的定义、指针变量的定义指针
5、变量的定义1.格式格式:数据类型数据类型*指针变量名指针变量名;例例int *p1;例例p;char *p2;2.说明说明:2.说明说明:(1)在变量定义时在变量定义时,*号表示该变量是指针变量号表示该变量是指针变量(注意注意:指针变量是指针变量是p1,p2,不是不是*p1,*p2)(p,p,p,p)(2)定义指针变量后定义指针变量后,系统为其分配存储空间系统为其分配存储空间,用以存放其他变量的地址用以存放其他变量的地址,但在对指针变量赋值前但在对指针变量赋值前,它并没有它并没有确定的值确定的值,也不指向一个确定的变量也不指向一个确定的变量例例:int x,*p;20121010px=5;px
6、51234注注:指针变量指针变量p的值是随机值的值是随机值,p注注 指针变量指针变量p的值是随机值的值是随机值,此时此时p 和和 x 并无关联并无关联(3)使指针变量指向一个确定的变量必须进行赋值使指针变量指向一个确定的变量必须进行赋值int x,*p;20121010 x=5;p=&x;px51010p二二指针变量的引用指针变量的引用二二、指针变量的引用指针变量的引用1.指针运算符指针运算符*(1)p与与*p不同不同 p是指针变量是指针变量 p的值是的值是p所指向的变量的地址所指向的变量的地址(1)p与与 p不同不同,p是指针变量是指针变量,p的值是的值是p所指向的变量的地址所指向的变量的地
7、址*p 是是p 所指向的变量所指向的变量,*p的值是的值是p所指向的变量的值所指向的变量的值*p 的值为的值为 5 (*p 表示表示 x),而而p 的值为的值为 1010(2)引用指针变量时的引用指针变量时的*与与 定义指针变量时的定义指针变量时的*不同不同(2)引用指针变量时的引用指针变量时的*与与 定义指针变量时的定义指针变量时的*不同不同定义变量时的定义变量时的*只是表示其后的变量只是表示其后的变量p是指针变量;是指针变量;引用时引用时*表示取指针变量表示取指针变量 所指向的变量所指向的变量 的值的值引用时引用时*表示取指针变量表示取指针变量p所指向的变量所指向的变量x的值的值。2012
8、1010int a,*p;p=&a;pa5101012让让p指向指向ap=&a;scanf(“%d”,p);printf(“%dn”,*p);pa等价等价于于&ap(%,p);*p=12;printf(“%dn”,*p);对对a 重新赋值重新赋值等价于等价于等价等价等价于等价于 a=122.&与与*p=&a;p&a;*&a?*(&a)?*p?a&*p?&(*p)?&a由于由于&和和*运算符优先级相等,所以按照从右运算符优先级相等,所以按照从右到左的顺序进行结合运算到左的顺序进行结合运算到左的顺序进行结合运算到左的顺序进行结合运算。3.*与与+,-int a=2,b=5,c,d,*p;20121
9、0102ab5,p;p1010(1)p=&a;(*p)+;(等价于等价于 a+;)101210143bc5p 的值为的值为a 的地址的地址,*p 的值为的值为2(p)+;(等价于等价于 a+;)3d语句执行之后语句执行之后p 的值不变的值不变,*p 的值为的值为 3(2)c=*p+;3等价于等价于c=*p;p+;执行后执行后 c 的值为的值为 3,*p 的值为的值为 5关于关于*p+的说明:由于的说明:由于*和和+运算符的优先级一样,遵从从运算符的优先级一样,遵从从右到右到左左的顺序的顺序,所以等价于所以等价于执行后执行后 c 的值为的值为 3 ,p 的值为的值为 5(3)d=*+p;右到的顺
10、序右到的顺序所以等价于所以等价于*(p+)。由于。由于+在在p的后面,则先操作后加一,所以写成的后面,则先操作后加一,所以写成c*p;p+;等价于等价于+p;d=*p;执行后执行后 d 的值为的值为 3,*p 的值为的值为 3=*p;p+;由于由于p的数据类型为的数据类型为int所以所以p+等价于等价于p=p+2参看课本参看课本pp+等价于等价于p p+2。参看课本参看课本P212 第二自然段的说明。第二自然段的说明。例例10.2输入输入a和和b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a和和b。ap1&a&b5#include void main()int*p1*p2*p
11、a b;bpp2&b&a59 int p1,p2,p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;bp&a9p;p;if(ab)p=p1;12p&a输出结果输出结果:p1=p2;p2=p;a=5,b=9max=9,min=5printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);p(,p,p);本程序的目的是本程序的目的是实现在指针变量实现在指针变量p1中存放值较大的中存放值较大的本程序的目的是本程序的目的是:实现在指针变量实现在指针变量p1中存放值较大的中存放值较大的变量的地址;变量的地址;p2中存放
12、值较小的变量的地址。中存放值较小的变量的地址。三、指针变量作函数参数三、指针变量作函数参数例例:2个数按大小顺序输出个数按大小顺序输出mainswap例例:2个数按大小顺序输出个数按大小顺序输出(整型变量做参数)整型变量做参数)#include ax559void swap(int x,int y)int temp;by995 int temp;temp=x;x=y;temp5说明说明:该程序不能实现该程序不能实现a和和by=temp;说明说明:该程序不能实现该程序不能实现a 和和b 的交换因为实参的交换因为实参a,b对形参对形参x,y是“值传递”是“值传递”,x 和和y的的变变void ma
13、in()int a,b;scanf(“%d%d”&a&b);yy变变化不影响化不影响a 和和b所以输出为所以输出为:a=5,b=9scanf(“%d%d”,&a,&b);if (ab)swap(a,b);printf(“a=%d,b=%dn”,a,b);,例例 10.3(指针变量做参数指针变量做参数)p1&t1mainswap1&(指针变量做参数指针变量做参数)#include void swap1(int *p1,int *p2)p1&apt1&a int temp;temp=*p1;*1*2a59*p1=*p2;*p2=temp;/*交换的是指针变交换的是指针变量指向的变量的值量指向的变量
14、的值*/p2&bpt2&b量指向的变量的值量指向的变量的值/void main()btemp5说明说明:这种方法是交换这种方法是交换p1和和95 int a,b,*pt1,*pt2;scanf(“%d%d”,&a,&b);t1&t2&b说明说明:这种方法是交换这种方法是交换p1和和p2所指向的变量的值所指向的变量的值,即即交换交换main函数中函数中a和和b的值的值pt1=&a;pt2=&b;if(ab)swap1(pt1,pt2);printf(“a=%d,b=%dn”,a,b);交换交换main函数中函数中a 和和b的值的值所以输出为所以输出为:a=9,b=5printf(a%d,b%dn
15、,a,b);例例 10.3#include 变参数变参数t1main&p1&swap2(指针(指针变变量做参量做参数数)void swap2(int *p1,int *p2)int*temp;pt1&ap1&a int*temp;*temp=*p1;*p1=*p2;a59pp;*p2=*temp;pt2&bp2&b说明说明:这种方法可以实现将这种方法可以实现将a,b的值互的值互换换但是可能会破坏系统的正常工作但是可能会破坏系统的正常工作btemp随机值随机值95换换,但是可能会破坏系统的正常工作但是可能会破坏系统的正常工作状态,因为状态,因为temp是一个指针变量但是是一个指针变量但是?5在函
16、数中并没有给在函数中并没有给temp一个确定的地一个确定的地址,这样它所指向的内存单元是不可预见的址,这样它所指向的内存单元是不可预见的,而对,而对*temp的赋值可能带来的赋值可能带来危害危害例例 10.3#include p1&at1main&bswap3(指针变量做参数)(指针变量做参数)void swap3(int *p1,int *p2)p1&a&apt1&b int *p;p=p1;12p2&b5a&bpt2&ap1=p2;p2=p;/*交换的是指针变交换的是指针变量的值量的值*/p2&b&bpt2&a量的值量的值*/p&a9b这种方法不能实现将这种方法不能实现将a,b的值互换,因
17、为只交换形参的值互换,因为只交换形参p1和和p2的值的值,使它使它们们们们的指向发生改变的指向发生改变,但是但是main函数中函数中的的 和和b的值并没有进行交换所以输的值并没有进行交换所以输的的a和和b的值并没有进行交换所以输的值并没有进行交换所以输出为出为:a=5,b=910.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量指向维数组的指针和指针变量指向维数组的指针和指针变量一一.指向指向一一维数组的指针和指针变量维数组的指针和指针变量1.一维数组及元素的地址表示一维数组及元素的地址表示i t5 1 2 3 4 5 数组的地址数组的地址int a5=1,2,3,4,5 ;数
18、组的地址数组的地址:a 元素地址元素地址*aa0&a0a*(a+1)a1&a1a+1*(a+1)a1&a1a+1*(a+2)a2&a2a+2*(a+3)a3&a3a+3*(a+4)a4&a4a+4(a 4)a4&a4a 42.用指针变量引用数组元素用指针变量引用数组元素(1)定义指针变量定义指针变量int *p,a5=1,2,3,4,5 ;p=a;/*指针指针p的值为内存中数组的值为内存中数组a的起始单元的地址的起始单元的地址*/(2)引用数组元素引用数组元素下标法地址法指针法下标法地址法指针法第第k个元素个元素ak*(a+k)*(p+k)第第 个元素个元素()(p)第第k个元素的地址个元素的
19、地址&aka+k p+k注意注意:指针变量也可以加下标指针变量也可以加下标 pk 等价于等价于 ak 分别用三种方法输出数组元素分别用三种方法输出数组元素 其效率不同其效率不同 分别用三种方法输出数组元素分别用三种方法输出数组元素,其效率不同其效率不同,下标法与地址法的效率相同下标法与地址法的效率相同,指针法的效率较快指针法的效率较快 用指针变量访问数组元素时要注意下标是否越界用指针变量访问数组元素时要注意下标是否越界 用指针变量访问数组元素时要注意下标是否越界用指针变量访问数组元素时要注意下标是否越界例例:将数组将数组a中全部元素加中全部元素加1,再输出再输出a#include 1a2pvo
20、id main()int a5=1,3,5,7,9,*p,j;f(5)35a+1a+246for(p=a;pa+5;p+)printf(“%3d”,*p);/*按指针访问数组按指针访问数组*/79a+3a+4810可以用可以用p+但不能用但不能用a+printf(“n”);9a+410可以用可以用p+,但不能用但不能用a+因为因为a 代表数组的起始地址代表数组的起始地址它它是地址常量是地址常量,不能改变不能改变;for(j=0;j5;j+)aj=aj+1;/*按数组名和下标访问数组按数组名和下标访问数组*/它它是地址常量是地址常量,不能改变不能改变;而而p 是一个指针变量是一个指针变量for(
21、j=0;j5;j+)if(“%3”*(j)/*按指针访问数组按指针访问数组p=a;printf(“%3d”,*(p+j);/*按指针访问数组按指针访问数组*/变意它前值变意它前值printf(“n”);使用指针使用指针变变量时要注量时要注意它意它的当的当前值前值3.指向数组的指针变量作函数参数指向数组的指针变量作函数参数 实参和形参都用数组名 实参和形参都用数组名maininv1例例10.7 将数组将数组a中中n个整数按相反顺序存放个整数按相反顺序存放 a0a1x0 x11397#include a1a2x1x24 6void inv1(int x ,int n)int temp,i,j,m=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 兼容模式 10 兼容模式 兼容 模式
限制150内