谭浩强c语言课件第10章

上传人:san****019 文档编号:70828619 上传时间:2019-01-18 格式:PPT 页数:88 大小:697.81KB
返回 下载 相关 举报
谭浩强c语言课件第10章_第1页
第1页 / 共88页
谭浩强c语言课件第10章_第2页
第2页 / 共88页
谭浩强c语言课件第10章_第3页
第3页 / 共88页
谭浩强c语言课件第10章_第4页
第4页 / 共88页
谭浩强c语言课件第10章_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《谭浩强c语言课件第10章》由会员分享,可在线阅读,更多相关《谭浩强c语言课件第10章(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

3、; void *pointer_5;,指针变量的赋值: 例、 pointer_1 = ,注意,指针变量中只能存放地址,不能将一个非地址类型的数据(如常数等)赋给一个指针变量,如:,pointer_1 = 100;,也可以在定义指针变量的同时指定其初值, 如: int a; int *p = ,二、指针变量的引用,有两个运算符可以引用指针变量: (1) (2)*:指针运算符。 用于访问指针变量所指向的变量。 *和&是互逆运算,例; i=3; 直接访问 ptr= 间接访问,说明:,1、在定义指针变量时,还未规定它指向哪一个变量,此时不能用*运算符访问指针。只有在程序中用赋值语句具体规定后,才能用*

4、运算符访问所指向的变量。,正确的引用:,2、区分:*运算符在不同场合的作用,编译器能够根据上下文环境判别*的作用。,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 *

5、p1, int *p2) int p; p = *p1; *p1 = *p2; *p2 = p;,main() int a, b; int *pointer_1, *pointer_2; 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 (

6、*q2 *q3) swap(q2,q3);,main() int a,b,c, *p1, *p2, *p3; scanf(“%d,%d,%d“, ,10.3 数组的指针和指向数组的指针变量,指针可以指向数组和数组元素,当一个指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针。并且,用指针访问数组元素,程序的效率更高。,一、指向数组元素的指针变量,指向数组元素的指针变量,其类型应与数组元素相同,例、 int a10; /* 元素为整型 */ float b10 ; /* 元素为实型 */ int *p; /* 可以指向数组a的元素 */ float *pf; /* 可以指向数组

7、b的元素 */ 为了让指针p指向数组a,应把数组a的地址赋给指针变量p。 p=a;或p=,二、通过指针引用数组元素 当使指针p指向数组a后,可以用指针p访问数组的各个元素。,#include main() int a=1,2,3,4,5,6,*p; p=a; *(p+3)+=2; printf(“%d,%dn”,*p,*(p+3); ,A 0,5 B1,5 C 0,6 D1,6,例10.5 输出数组的全部元素。(设10个元素,整型)。,方法一:,1、下标法(常用,很直观) main() int a10; int i; for(i=0;i10;i+) scanf(“%d“, ,方法二;,2、用数

8、组名计算数组元素的地址。(效率与下标法相同,不常用) 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)与*(a+i)意义相同,但仍应注意p与a的区别,a是地址常量,而p是指针变量。例、 for(p=a; a(p+10); a+) a代表数组的首地址,是不变的,a+不合法 2、指针变量可以指向数组中的任何元素,注意指针

9、变量的当前值。,例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“); p = a; for(i=0;i10; i+,p+) printf(“%d“,*p);,3、 使用指针时,应特别注意避免指针访

10、问越界。在上例中,第二次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)相当于a+i,先使p加1,再取*p。 *(-p)相当于a-i,先使p减1,再取*p。,三、数组名

11、作函数参数,数组名代表数组首地址,因此,它作实参在函数调用时,是把数组首地址传送给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。,例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,m=(n-1)/2; for(i=0; i=m; i+) j = n - 1

12、- 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()可以用指针作形参,运行情况与用数组作形

13、参相同。,void inv(int *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、形参和实参均使用指针变量。,小结:数组作函数的参数,实参和形参之间传送数组的首地址,首地址可以用指针表示,也可以用数组名表示,因此,实参和形参有以下四种组合情况。,若有以下

14、调用语句,则不正确的fun函数的首部是 A) void fun(int m, int x ) B) void fun(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的地址,同时代表

15、第一行元素的首地址。 a+1表示第二行元素的首地址,也是元素a10的地址。 a+2表示第三行元素的首地址,也是元素a20的地址。,由于把a0、a1、a2看成一维数组(一维数组名),它们代表各自数组的首地址,即:,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,补充练习:,若有以下定义和语句:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号