谭浩强C语言课件第10章.ppt
《谭浩强C语言课件第10章.ppt》由会员分享,可在线阅读,更多相关《谭浩强C语言课件第10章.ppt(88页珍藏版)》请在三一办公上搜索。
1、第十章 指针10.1 指针的概念,指针(pointer):是一个变量的地址。指针变量:是一个变量,其值是另一个变量的地址。任何变量都在计算机内存中占有一块内存区域,变量的值就存放在这块内存区域之中,一个变量的访问(访问是指取出其值或向它赋值)方式有两种:(1)直接访问,通过变量名访问,如通过变量名i直接访问。(2)间接访问,通过该变量的指针来访问,如通过i_pointer访问变量i。,10.2 变量的指针,一、指针变量的定义指针变量有三个属性:(1)该指针变量指向的变量的类型。如i_pointer指向的变量i是整型。(2)该指针变量在内存中占多少内存单元。如i_pointer占两个内存单元,称
2、为“近指针”,用near表示。如果该变量在内存中占4个内存单元,称为“远指针”,用far表示。如果未指定near或far,缺省是near。(指针变量在内存中要么占2个内存单元,要么占4个内存单元)。(3)该指针变量指向哪一个变量,即该指针变量的值是多少。如i_pointer的值是2000。指针变量定义的一般形式:类型标识符*标识符 如:int*pointer_1,*pointer_2;,例、int i,j;/*定义两个整型变量*/int*pointer_1,*pointer_2;float*pointer_3;char*pointer_4;void*pointer_5;,指针变量的赋值:例、p
3、ointer_1=,注意,指针变量中只能存放地址,不能将一个非地址类型的数据(如常数等)赋给一个指针变量,如:,pointer_1=100;,也可以在定义指针变量的同时指定其初值,如:int a;int*p=,二、指针变量的引用,有两个运算符可以引用指针变量:(1)(2)*:指针运算符。用于访问指针变量所指向的变量。*和&是互逆运算,例;i=3;直接访问 ptr=间接访问,说明:,1、在定义指针变量时,还未规定它指向哪一个变量,此时不能用*运算符访问指针。只有在程序中用赋值语句具体规定后,才能用*运算符访问所指向的变量。,正确的引用:,2、区分:*运算符在不同场合的作用,编译器能够根据上下文环
4、境判别*的作用。,int a,b,c;int*p;(*表示定义指针)p=(*表示乘法运算符),例10.2 输入a和b两个整数,按先大后小的顺序输出a和b。,main()int*p1,*p2,*p,a,b;scanf(%d,%d,p1=,if(ab)p=p1;p1=p2;p2=p;p1指向较大值,p2指向较小值.,程序说明:,三、指针变量作为函数的参数,例10.3 题目要求输入a和b两个整数,按先大后小的顺序输出a和b。,int swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;,main()int a,b;int*pointer_1,*pointer_2
5、;scanf(%d,%d,例10.4 输入a、b、c三个整数,按大小顺序输出。,int swap(int*pt1,int*pt2)int p;p=*pt1;*pt1=*pt2;*pt2=p;int 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);,main()int a,b,c,*p1,*p2,*p3;scanf(%d,%d,%d,10.3 数组的指针和指向数组的指针变量,指针可以指向数组和数组元素,当一个指针指向数组后,对数组元素的访问,既可以使用数
6、组下标,也可以使用指针。并且,用指针访问数组元素,程序的效率更高。,一、指向数组元素的指针变量,指向数组元素的指针变量,其类型应与数组元素相同,例、int a10;/*元素为整型*/float b10;/*元素为实型*/int*p;/*可以指向数组a的元素*/float*pf;/*可以指向数组b的元素*/为了让指针p指向数组a,应把数组a的地址赋给指针变量p。p=a;或p=,二、通过指针引用数组元素当使指针p指向数组a后,可以用指针p访问数组的各个元素。,#includemain()int a=1,2,3,4,5,6,*p;p=a;*(p+3)+=2;printf(“%d,%dn”,*p,*(
7、p+3);,A 0,5 B1,5C 0,6 D1,6,例10.5 输出数组的全部元素。(设10个元素,整型)。,方法一:,1、下标法(常用,很直观)main()int a10;int i;for(i=0;i10;i+)scanf(%d,方法二;,2、用数组名计算数组元素的地址。(效率与下标法相同,不常用)main()int a10;int i;for(i=0;i10;i+)scanf(%d,方法三:,3、用指针访问各元素。(常用,效率高)main()int a10;int*p,i;for(i=0;i10;i+)scanf(“%d”,注意:,1、若指针p指向数组a,虽然p+i与a+i、*(p+i
8、)与*(a+i)意义相同,但仍应注意p与a的区别,a是地址常量,而p是指针变量。例、for(p=a;a(p+10);a+)a代表数组的首地址,是不变的,a+不合法2、指针变量可以指向数组中的任何元素,注意指针变量的当前值。,例10.6 输出数组a的10个元素。,程序:main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%d,*p);printf(%d,*p);,main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n)
9、;p=a;for(i=0;i10;i+,p+)printf(%d,*p);,3、使用指针时,应特别注意避免指针访问越界。在上例中,第二次for循环,p已经越过数组的范围,但编译器不能发现该问题。,4、指针使用的几个细节。,设指针p指向数组a(p=a),则:p+(或 p+=1),p指向下一个元素。*p+,相当于*(p+)。因为,*和+同优先级,+是右结合运算符。*(p+)与*(+p)的作用不同。*(p+):先取*p,再使p加1。*(+p):先使p加1,再取*p。(*p)+表示,p指向的元素值加1。如果p当前指向数组a的第i个元素,则:*(p-)相当于ai-,先取*p,再使p减1。*(+p)相当于
10、a+i,先使p加1,再取*p。*(-p)相当于a-i,先使p减1,再取*p。,三、数组名作函数参数,数组名代表数组首地址,因此,它作实参在函数调用时,是把数组首地址传送给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。,例10.7 将数组a中n个元素按相反顺序存放。,算法:a0与an-1交换,a1与an-2交换,.,a(n-1)/2与an-int(n-1)/2)交换。实现:用i,j作元素位置变量,开始i=0,j=n-1。将ai与aj交换,然后i加1,j减1,直到i=(n-1)/2。,void inv(int x,int n)int t,i,j
11、,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=ai;ai=aj;aj=t;return;,main()static int i,a10=3,7,9,11,0,6,7,5,4,2;printf(the original array:n);for(i=0;i10;i+)printf(%d,ai);printf(n);inv(a,10);printf(the array hans been inverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);,函数inv()可以用指针作形参,运行情况与用数组作形参相同。,void inv(i
12、nt*x,int n)int*p,t,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;return;,例10.8 从10个数中找出其中最大值和最小值。只找出其中最大值和最小值,不能改变元素的排列顺序)。方法1、实参和形参均用数组变量。,方法2、形参和实参均使用指针变量。,小结:数组作函数的参数,实参和形参之间传送数组的首地址,首地址可以用指针表示,也可以用数组名表示,因此,实参和形参有以下四种组合情况。,若有以下调用语句,则不正确的fun函数的首部是 A)void fun(int m,int x)B)void f
13、un(int s,int h41)C)void fun(int p,int*s)D)void fun(int n,int a)main()int a50,n;fun(n,D,四、多维数组的指针二维数组static int a34=1,3,5,7,9,11,13,15,17,19,21,23;理解为:有三个元素a0、a1、a2,每一个元素代表一行,每一个元素是一个包含4个元素的数组,数组名a代表:整个二维数组的首地址,也是元素a00的地址,同时代表第一行元素的首地址。a+1表示第二行元素的首地址,也是元素a10的地址。a+2表示第三行元素的首地址,也是元素a20的地址。,由于把a0、a1、a2看
14、成一维数组(一维数组名),它们代表各自数组的首地址,即:,a0&a00 等价于*(a+0),a1&a10 等价于*(a+1),a2&a20 等价于*(a+2),根据一维数组的表示方法,有:,a0+1:&a01 一维数组中第二个元素的地址,a1+1:等价于*(a+1)+1,a0+2:&a02,综上所述,二维数组a的地址用下图说明,已知某元素的指针后,可以用*运算符访问该元素。例、,*(a1+2)=a12=13,二维数组元素aij 的值可用以下方式表示:*(a i+j),*(*(a+i)+j),aij二维数组元素aij的地址可用以下方式表示:a i+j,*(a+i)+j,&aij详见:P225,补
15、充练习:,若有以下定义和语句:int s45,(*ps)5;ps=s;则对s数组元素的正确引用形式是()A)ps+1B)*(ps+3)C)ps02D)*(ps+1)+3,C,例10.11 运行,2、指向多维数组的指针变量,(1)指向数组元素的指针变量。(用列指针对二维数组进行操作),例10.12 用指针变量输出数组元素的值。,main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(n);printf(%4d,*p);,注意:本例用指针顺序访问二维数组的元素。
16、若需访问二维数组anm(n行m列)的某个元素aij,计算该元素的相对位置公式为:,i*m+j(i,j=0,1,2,.)这种方法相当于把二维数组转化为一维数组来使用。,(2)指向m个元素组成的一维数组的指针变量(用行指针对二维数组进行操作)int(*p)4;,例10.13:输出二维数组任一行任一列元素的值。,main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4,i,j;p=a;scanf(“i=%d,j=%d”,说明:(*p)4表示p为单独一个指针变量,行指针,指向含有4个元素的一维数组,即*p有4个元素,每个元素为整型。*p4为指针数组,*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 谭浩强 语言 课件 10

链接地址:https://www.31ppt.com/p-6026813.html