c语言ppt10

上传人:luoxia****01812 文档编号:57661734 上传时间:2018-10-23 格式:PPT 页数:90 大小:320KB
返回 下载 相关 举报
c语言ppt10_第1页
第1页 / 共90页
c语言ppt10_第2页
第2页 / 共90页
c语言ppt10_第3页
第3页 / 共90页
c语言ppt10_第4页
第4页 / 共90页
c语言ppt10_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《c语言ppt10》由会员分享,可在线阅读,更多相关《c语言ppt10(90页珍藏版)》请在金锄头文库上搜索。

1、第10章 指针指针-C语言的精华,10 . 1 地址和指针的概念指针就是地址。有变量的、数组的、函数的、字符串的指针等。一、内存的访问方式1、直接访问如:i=2, j=6, k=9 , 通过变量i、j、k 来访问存储单元。2、间接访问如变量 i,不知道其值及地址,而只知道它的地址放在3010、3011中,因此可通过存放地址的单元找到变量 i 的值,此为间接访问。对间接访问,可定义一变量存放地址,如定义ipointer, 赋值 ipointer=&i,2000200220043010,ijki_p,3692000:,内存用户数据区,: :,二、指针的概念一个变量的地址称为该变量的“指针”。i的地

2、址是2000,则地址2000是变量I的指针。存放地址的变量叫“指针变量”,指针变量存放地址。ipointer存放的是变量I的地址。i 变量ipointer 指针变量 ipointer=&i,10 . 2 变量的指针和指向变量的指针变量一、指针变量的定义 一般形式: 类型标识符 *变量名 如:int *p1; char *p2;float *p3; 说明: (1) * 表示指针型变量,意为“指向的指针”(2) 指针变量有确定的指向的数据类型。思考:指针变量存放的是一个地址,为什么定义时需要指定类型?,二、指针变量的引用 1、给指针变量赋值 (赋变量的地址)如: p1=*p与i等价,i=3, 则*

3、p1也为3。注意:p1是地址变量, 而*p 1是非地址变量,与i等价。 “*”:为指针运算符或叫指向运算符、间接运算符,为单目运算符。,2、用指针变量对变量赋值如: int I , j , *p;p=,定义后,p=&I后,*p=3后,I j p,例10.1main() int a,b;int *pointer1, *pointer2;a100;b=10;pointer1&a; /*把变量a的地址赋给pointer_1*pointer2=&b; *把变量b的地址赋给pointer_2*printf (”d,dn”, a,b);printf(”d,dn”, *pointer1,pointer2);

4、,关于运算符&*p1=? 相当于 &(*p1) 等于 &(*p1)=&(a)=&a=p1 *&a 相当于 *(&a)=a(2)优先级 处于第二位,(2) 自增自减运算 如: int a,b,*p;p= 当p为1000,则p+为1004+与*同一级别,均为从右至左,例102输入整数a和b,按大小的顺序输出。main ( )int *p1,*p2,*p, a, b;scanf(“d,d“,printf (“na=d,b=dn”,a,b);printf(“max=d,min=dn“,*pl,*p2);,交换地址(指针变量),使p1指向大数b,而变量a、b未变。,&a,&b,9,&b,&a,p1 a

5、p1 a,p2 b p2 b,5,5,9,p,p,三、指针变量作为函数参数说明:将一个变量的地址传送到另一函数中,实参和 形参均用指针。 例103 对整数按大小顺序输出。用函数处理,且用指针作函数参数。 swap(int *p1 ,int *p2)int p;p=*p1; *p1=*p2; *p2=p; main() int a,b;int *p1, *p2; scanf(“d,d”, if(ab) swap (p1 ,p2); printf (“nd,dn“a,b); ,传递的是变量的指针,在函数中交换的是变量中的内容,主函数中读取交换了的内容。这里指针未变,与上题相反。,以下代码可以实现变

6、量a与b的交换吗?swap(int *pl,int *p2)int *p;ppl;p1=p2;p2p; main() int a,b;int *p1,*p2;scanf (”dd”,&a,b);p1=&a;p2=b;if(ab) swap(p1 ,p2);printf(”nd,dn”,* p1,*p2); ,出错的原因是参数不是双向传递。,例104 输入a、b、c三个整数,按大小顺序输出。swap(int *pt1 ,int *pt2)int p;p=*p1;*ptl=*pt2;*pt2=p; exchange(int *q1,int *q2,int *q3)if(*ql*q2) swap (

7、q1,q2);if(*ql*q3)swap(q1,q3);if(*q2 *q3) swap (q2,q3);,main()int a,b,c,*p2,*p3;scanf(”d,dd“, 运行情况如下:输入:3,2,4 输出:4,3,2,10. 3 数组与指针,内容:指向数组元素的指针变量及其应用指向一维数组的指针变量及其应用数组的指针是数组的起始地址,数组元素的指针是元素的地址。引用数组可以用下标法,也可以用指针法,通过指向数组的元素的指针找到数组元素。使用指针法能使目标程序占内存少,运行速度快。,一、指向数组元素的指针1、定义, 同变量的指针定义相同类型标示符 * 变量名 如: int a1

8、0; int *p; float b10; float *p1; -类型相同2、赋值,将某元素或数组的首地址赋给指针变量。 如: int a10, *p;p=(此与语句 *p=&a0 、p=a 不同) 注意:对p赋的是地址,而不是数值。,二、通过指针引用数组元素元素赋值、取值如: int a10,*p; p=a; *p=1; 相当于 a0=1; 1、各元素地址(用以上定义)指针 p 增一便指向下一单元。 所以 p 指向 a0 p+1 指向 a1 p+2 指向 a2: p+i 指向 ai: p+9 指向 a9,因 p=a,因此 p=a, p+i 与 a+i 等价。所以有a 指向 a0 a+1 指

9、向 a1 a+2 指向 a2: a+i 指向 ai a+9 指向 a92、引用元素 直接引用 a0=1; ai =6; 通过地址应用 如:*p=1; *(p+i)=6; 或者 *a=1; *(a+i)=6;“ ” 实际是变址运算符。如ai 在这里变的值为 i*2,“2”是整型数据占两个字节。,3、指向数组的指针变量也可带下标如: p i 与 *(p+i) 等价。若 p=a; 则 p i 与 ai 等价。 例10. 5 输出一数组的全部元素。 main() int a10=1,2,3,4,5,6,7,8,9,0;int *p, i;for(i=0;i10;i+)printf(“%d “,ai);

10、 printf(“n“);for(i=0;i10;i+)printf(“%d “,*(a+i); printf(“n“);for(p=a;p(a+10);p+)printf(“%d “,*p); printf(“n“); ,几个注意的问题: (1)p可变,而a不可变。即有p+,而无a+。 (2)当p 变时注意p当前的值。 例 10.6 输出数组a的全部元素。 main() int *p,i,a10;p=a;printf(“Enter 10 numbers:n“);for(i=0;i10;i+)scanf(“%d“,p+);printf(“n“); p=a;for(i=0;i10;i+,p+)p

11、rintf(“ %d “,*p);,(3)关于指针变量的一些运算(设p=a)1)p+ , p-;2)*p+ 等价于 *(p+),先得到*p的值,再做p+*p- 等价于 *(p-) , 先得到*p的值,再做p-;3)*(p+) p先自增1,再得到*p的值*(p-) p先自减1,再得到*p的值;4)(*p)+ 使元素值加1,(*p)- 使元素值减1。,三、数组名作函数参数1、数组名作函数参数2、指针变量作函数参数 例10.7 将数组a中n个数反序排列 void inv(int x,int n) int t,i,j,m=(n-1)/2;for(i=0; im; i+)j=n-1-i;t=xi; xi

12、=xj;xj=t;return; ,main() static int i, a10=0,1,2,3,4,5,6,7,8,9;printf(“the orginal array:n“);for(i=0;i10;i+)printf(“%d “,ai);printf(“n“);inv(a,10);printf(“the array has been inverted:n“);for(i=0;i10;i+)printf(“%d “,ai);printf(“n“); 运行结果:9 8 7 6 5 4 3 2 1 0,指针变量作函数参数(形参) void inv(int *x,n)int *p,t,*i

13、,*j;int m=(n-1)/2;j=x+n-1;p=x+m;for(i=x; ip; i+,j-) t=*i; *i=*j; *j=t;return;,提示:数组的指针和指向数组的指针变量int a10, *p;p=a; 第i个元素的地址:p+i 或 a+i 、&ai 第i个元素: *(p+i) 或 *(a+i)、ai,例 10.8 p240 例 10.9 p241 例 10.10 p245,四、指向多维数组的指针和指针变量 (一)多维数组的地址根据数组的性质,二维数组看作是一维数组,如 static int a34=1,3,5,7,9,11,13,15,17,19,21,23; 存放情况如下图所示。看成一维数组时,元素为a0、a1、a2, 每个元素又是一维数组。1、数组的首地址 为 a2、各行的首地址 (1)用a表示 a+i为第i行首地址第0行首地址为 a ,第1行首地址为a+1,第2行为 a+2。 因为看成一维 数组,所以a+1指向了a1,即第一行。,(2)用ai 表示因为 第0行的地址为 a0,第1行的地址为a1 ,第2行的地址为a2。(因为 a0、a1、a2为数组名)ai 为第 i 行、第0列元素的地址。各行首地址的变化情况: 设数组首地址为2000,则各行首地址为: 2000、2008、2016, 各行相差 4*2=8。,

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

当前位置:首页 > 资格认证/考试 > 计算机等级考试

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