c语言程序设计----指针ppt课件

上传人:aa****6 文档编号:54865225 上传时间:2018-09-20 格式:PPT 页数:70 大小:560KB
返回 下载 相关 举报
c语言程序设计----指针ppt课件_第1页
第1页 / 共70页
c语言程序设计----指针ppt课件_第2页
第2页 / 共70页
c语言程序设计----指针ppt课件_第3页
第3页 / 共70页
c语言程序设计----指针ppt课件_第4页
第4页 / 共70页
c语言程序设计----指针ppt课件_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《c语言程序设计----指针ppt课件》由会员分享,可在线阅读,更多相关《c语言程序设计----指针ppt课件(70页珍藏版)》请在金锄头文库上搜索。

1、语言程序设计,第10章 指针,2004,指针变量:存放变量地址的变量由此对变量的操作可转换为对指针变量的操作,一、地址和指针的概念,一个变量的访问(访问是指取出其值或向它赋值)方式有 两种:(1)直接访问,通过变量名访问,如通过变量名i直接访问。 (2)间接访问,通过该变量的指针来访问,如通过i_pointer访问变量i。*i_pointer i,二、变量的指针和指向变量的指针变量,变量的指针:就是变量的地址。如i所对应的内存地址是2000,则i的指针就是2000指针变量:用来存放变量地址的变量, 如:ip所对应的地址是3010,其内容是2000, 2000就是 i 所对应的地址(指针),因此

2、,ip是存放变量 i 的地址的变量。 若ip是存放变量i 的地址的指针变量,即ip=则 *ip是指针变量 ip所指的对象(即变量 i ),1、定义一个指针变量 指针变量在使用前必须定义,以便使其指向特定类型的变量,指针变量的定义形式: 类型标识符 * 标识符 其中:类型标识符:指出指向何种数据类型的变量 标识符:表示指针变量名.,例: float * p3; /* p3是指向实型变量的指针变量 */ char * p4; /* p4是指向字符型变量的指针变量 */char *p1,p2;char* p1,p2; 说明: 1、定义时指针变量名前以 * 开头。 2、指针变量一经定义就只可指向同类型

3、的变量。 如:float *p3; 指针变量名是p3,它只能指向实型数据。 3、在引用中,指针变量前加 * 表示指针变量所指向的对象的值(即变量)。,2、指针变量的引用 通常,只能将变量的地址赋给指针变量,但在Turbo c中 ,整型数据(十进制、十六进制、八进制)也可赋给指 针变量。 如:int *p1; p1=100; printf(“%d n”,* p1); 指针变量有两种运算符: *:指针变量所指对象运算符,如:* p1, 示p1指向的对象是变量i,指针变量操作简例 main( ) int a, b, *p1, *p2 ; a=100; b=10; p1= a=100, b=10 *p

4、1=100, *p2=10 &a=ffd4, &b=ffd6 p1=ffd4, p2=ffd6 &p1=ffd8, &p2=ffda,关于 则 &* p1 &a (p1) &* p2 &b (p2) p2=&*p1 p2=&a,2. *&a:先进行&a得a的地址,再对a的地址进行* 运算。即指向a地址所指向的变量,就是a,其值是100 3.运算符*,+:优先级为2, 结合性:从右到左 (* p1)+ a+ * p1+ * (p1+) 注意+是后加 意即: 将p1所指向的对象a的值取出,然后使a的值自增。p1原指向a,p1自增,现在指向下一个变量了。,输入a,b,用指针方法按先大后小的顺序输出。

5、 main( ) int *p1, *p2, *p, a, b; scanf(“%d%d”, ,3、指针变量作为函数参数 指针变量作为函数参数时,传递的是变量的地址。 指针变量作函数参数,将两个整数按大小顺序输出。 swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p; printf(“ ,main( ) int a, b, *p11, *p12; scanf(“%d%d”, ,形参、实参都是指针变量时,虽在被调函数中改变了指针的值,但当返回主函数时,分配单元被释放,主调函数中的实参指针仍指向原来变量。 swap(int *p1, int *p

6、2) int *p; p=p1; p1=p2; p2=p; printf(“ ,main( ) int a, b, *p11, *p12; scanf(“%d%d”, ,三、数组的指针和指向数组的指针变量,数组的指针:指数组的起始地址。 数组元素的指针:指数组元素的地址。 数组的地址赋予指针变量,指针变量就指向该数组了。 引用数组元素: (1) 下标法:a3 (2) 指针法:用指针变量指向所找的数组元素。,10.3.1 指向数组元素的指针 例:int a5; int *p; p=a; p=,main( ) int a5; int *p= 输出:&p=ffd8, p=ffce &a=ffce,

7、&a=ffce, &a0=ffce, a0=2 *p=2,10.3.2 通过指针引用数组元素 指针变量所指数组元素的地址的计算,与数组数据类型有关。 指针变量指向不同类型数组时,指针变量值加1其意义不同 main( ) int i, a3=1, 3, 5; float b3=2,4,6; int *p1=a; float *p2=b; printf(“ /如果没有红色的语句,会出现什么问题,几点说明: 设a:数组,p:指针变量,当数据类型不同时其地址的计算方法也不同。(1) p=a p+i = = a+i &ai 而a的第 i 个元素的实际地址为: a+i a + i * d (数组元素所占字

8、节数),如:数组a第2个元素的地址: a+2*2=ffc4+4=ffc8 数组b第2个元素的地址: b+2*4=ffca+8=ffd2,(2) * (p+i)=*(a+i)=ai 编译时,按数组首地址加上相对位移量得到要找数组元素的地址,然 后取出该单元中的内容,即: * (a + i) 例:a的首地址:ffc4,则对a2的存取方法为: * (&a2) = * (a地址+2*2)= * (ffc4+4) = * (ffc8) = a2 = 5 (3)指向数组的指针变量可带下标 如: pi, ai, * (a+i), * (p+i) 都是指向a数组的第i个元素。其中: a: 数组名 p: 指向a

9、 的指针变量 初值p = a,举例:用三种方法输出数组元素例1 用下标法 main( ) int i, a5=55, 66, 77, 88, 99; for(i=0; i5; i+) printf(“ 输出: &a0=ffd2, a0=55 &a1=ffd4, a1=66 &a2=ffd6, a2=77 &a3=ffd8, a3=88 &a4=ffda, a4=99,例2 计算数组元素地址法 main( ) int i, a5=55, 66, 77, 88, 99; for(i=0;i5;i+) printf(“(a+%d)=%x,*(a+%d)=%d n”,i,(a+i), i,*(a+i)

10、; 输出: (a+0)=ffd0, *(a+0)=55 (a+1)=ffd2, *(a+1)=66 (a+2)=ffd4, *(a+2)=77 (a+3)=ffd6, *(a+3)=88 (a+4)=ffd8, *(a+4)=99,例3 用指针变量指向数组元素法(指针法) main( ) int *p, a5=55, 66, 77, 88, 99; for (p=a; p (a+5); p+) printf(“p=%x, *p=%d n”, p,*p); 输出: p=ffd0, *p=55 p=ffd2, *p=66 p=ffd4, *p=77 p=ffd6, *p=88 p=ffd6, *p

11、=99,例4 指针下标法及指针变量指向数组元素 main( ) int i, * p, a5=55, 66, 77, 88, 99; p=a; for(i=0;i5;i+) printf(“p%d=%d,*(p+%d)=%dn”, pi,i,*(p+i); 输出: p0=55, *(p+0)=55 p1=66, *(p+1)=66 p2=77, *(p+2)=77 p3=88, *(p+3)=88 p4=99, *(p+4)=99,使用指针变量时要注意的问题: (1)p+: 合法,因p是指针变量,+只能用于变量。 a+: 不合法,因为a是数组名,其值是数组元素的首地址,是常量。a代表数组的首地

12、址,是不变的,a+不合法 (2)指针变量使用时要注意当前值. (3)数组下标越界时,编译不作检查,如下例。,例 利用指针变量连续两次输出数组元素 main( ) int i, * p, a5=55, 66, 77, 88, 99; p=a; for(i=0; i5; i+,p+) printf(“p=%x, *p=%d n”, p, *p); for(i=0; i5; i+, p+) printf(“p=%x, *p=%d n”, p, *p); 此结果,是何原因?P需要重置 输出: p=ffd2, *p=55 p=ffd4, *p=66 p=ffd6, *p=77 p=ffd8, *p=88

13、 p=ffda, *p=99 p=ffdc, *p=-24 p=ffde, *p=285 p=ffe0, *p=1 p=ffe2, *p=-26 p=ffe4, *p=1444,(4) 指针变量使用时的几个问题; +和* 优先级为2,结合性从右向左 若 p=a+3 则: *p+:将p所指对象(a3)的值88取出,然后p增1 指向a4 *+p:先将p增1指向a4,然后将其指向的对象a4的值99取出。 *p- - :将p所指对象(a3)的值88取出,然后p减1 指向a2 *- -p :先将p减1指向a2,然后将其指向的对象a2的值77取出 若:p=a+i, 则 *p+ 与 ai+ *p- - 与

14、ai- - *+p 与 a+i 等价 *- -p 与 a- -i,题目:写一个函数,求一个字符串的长度,在main函数中输入字符串 ,并输出其长度。 (用指针)length(char *p) int n;n=0;while(*p!=0)n+;p+;return n; ,main() int len;char str20;printf(“please input a string:n“);scanf(“%s“,str);len=length(str);printf(“the string has %d characters.“,len); ,题目:读结果。 #include “stdio.h“

15、#define M 5 main()int aM=1,2,3,4,5; int i,j,t;i=0;j=M-1;while(ij)t=*(a+i);*(a+i)=*(a+j);*(a+j)=t;i+;j- -;for(i=0;iM;i+) printf(“%d“,*(a+i); ,10.3.3 数组名作函数参数 main( ) int array10; f(array, 10); f (int arr , int n) 调用函数时,以数组名作实参时实际上是把数组的首地址传递给形参, 此时,形参数组和实参数组占用的是同一段内存,在函数调用过程中, 改变形参数组元素实际上也是改变实参数组元素,调用结束后,虽然形 参数组名不存在了,但对实参数组元素的操作起产生作用。,

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

当前位置:首页 > 大杂烩/其它

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