清华大学c语言第十章

上传人:san****019 文档编号:70873025 上传时间:2019-01-18 格式:PPT 页数:64 大小:478.81KB
返回 下载 相关 举报
清华大学c语言第十章_第1页
第1页 / 共64页
清华大学c语言第十章_第2页
第2页 / 共64页
清华大学c语言第十章_第3页
第3页 / 共64页
清华大学c语言第十章_第4页
第4页 / 共64页
清华大学c语言第十章_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《清华大学c语言第十章》由会员分享,可在线阅读,更多相关《清华大学c语言第十章(64页珍藏版)》请在金锄头文库上搜索。

1、第10章 指 针 10.1 地址和指针的概念 指针 pointers:与机器内部的硬件结构(内存地址)及其对数据的处理形式等有关。,指针变量:存放变量地址的变量 由此对变量的操作可通过指针来完成,例如:int i, j, k; i=3; j=6; k=i+j;,编译时,系统将内存单元分配给变量后, 程序执行时对变量的操作实际上就是根据变量名查找与之对应的变量的地址,然后按地址对数据进行操作。 1.直接访问 k = i + j 2004 2000 2002 2004 =9 2000=3 2002=6 2.间接访问 *kp = *ip + *jp 3014 3010 3012 3014 2004

2、3010 2000 3012 2002 2004=9 2000=3 2002=6 ip, jp, kp: 指针变量, 其它变量的内存地址。,10.2 变量的指针和指向变量的指针变量 变量的指针:就是变量的地址。 指针变量:用来存放变量地址的变量,如:变量i的指针(地址)是2000,ip是存放i的指针的变量,其自身地址是3010,内容是2000,即i 的地址(指针)。即: ip 是存放变量 i 地址的指针变量(ip=) *ip 是指针变量 ip 所指的对象变量(*ip=i ),10.2.1 定义一个指针变量 指针变量使用前必须定义,以便使其指向特定类型的变量。 指针变量定义形式: 类型标识符 *

3、 标识符 其中:类型标识符:表示所指向变量的数据类型 标识符:表示指针变量名. 例:float *p3;/* p3是指向实型变量的指针变量 * / char *p4; /*p4是指向字符型变量的指针变量* /,int i, j; int *p1, *p2; p1=,10.2.2 指针变量的引用 1、指针变量有两种运算符 *:指针变量所指对象运算符 如:*p1,访问p1所指对象:变量i 说明: 定义时,指针变量名前以*开头说明用途。 引用中,指针变量名前加*表示指针变量所指 对象 看下面的一个例子。,main() int a,b; int *p1,*p2; a=10;b=20; p1= ,mai

4、n() int a,b,c; int *p1,*p2; a=10;b=20; p1= ,运行结果:30 40,运行结果:10,20 10,20,指针变量操作简例 main( ) int a, b, *p1, *p2 ; a=100; b=10; p1= ,运算结果: a=100, b=10 *p1=100, *p2=10 &a=ffd4, &b=ffd6 p1=ffd4, p2=ffd6 &p1=ffd8, &p2=ffda,2、 则 &* p1 &a (p1) &* p2 &b (p2) p2=&* p1 p2=&a * & a a,3. 指针的算术运算 指针赋值:可将地址常量或指针变量的值

5、赋给另一个变量。int a,b,*p1,*p2; p1= 看下面的例子.,举例: 输入a,b,用指针方法按先大后小的顺序输出。 main( ) int *p1, *p2, *p, a, b; scanf(“%d%d”, ,输入: 5 9 输出: a=5,b=9 *p1=5,*p2=9 &a=ffd6, &b=ffd8 p1=ffd6, p2=ffd8 &p1=ffd0,&p2=ffd2 a=5, b=9 *p1=9,*p2=5 &a=ffd6,&b=ffd8 p1=ffd8, p2=ffd6, p=ffd6 &p1=ffd0,&p2=ffd2,&p=ffd4 max=9, min=5,10.2

6、.3 指针变量作为函数参数 指针变量作为函数参数时,传递的是变量的地址。 看下例数据交换。首先: 形实参采用普通变量 swap1(int x, int y) int t; t=x; x=y; y=t; printf(“ ,在被调用函数中变量的值被交换了,返回主函数后,变量的值为什么依旧? 原因:单向的值传递,当函数调用返回后,分配的单元被释放了.,其次 : 指针变量作函数参数,将两个整数按大小顺序输出 swap2(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p; printf(“ ,main( ) int a, b, *p11, *p12; sca

7、nf(“%d%d“, ,问题:函数调用结束后, 分配给p1,p2单元释放否?,对swap2 函数稍作改动 swap2(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p2=*p; printf(“p=%x, p1=%x, p2=%xn“, p, p1, p2); main ( ) int a, b; int * p11, * p12; scanf(“%d%d“, ,运行:5, 9 输出:p=ffd2, p11=ffd2, p2=ffd4 a=9, b=9,形参、实参都是指针变量 swap3(int *p1, int *p2) int *p; p=p1;

8、p1=p2; p2=p; printf(“ ,结论:形参与实参之间的数据传递是单向的值传递,实参的值不会改变。 若在被调函数中通过指针变量改变所指对象的值,结果如何?,举例: 输入 a, b, c三个整数,按从大到小顺序输出 swap(int *pt1, int *pt2) int p; p=*pt1; *pt1=*pt2; *pt2=p; 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); printf(“,print

9、f(“ ,输入:9 0 10 输出:&a=ffd0, &b=ffd2, &c=ffd4, a=9, b=0, c=10 &p1=ffd6, &p2=ffd8, &p3=ffda, p1=ffd0, p2=ffd2,p3=ffd4 *p1=9, *p2=0, *p3=10 &q1=ffca,&q2=ffcc,&q3=ffce,q1=ffd0,q2=ffd2,q3=ffd4 *q1=10,*q2=9,*q3=0 a=10,b=9,c=0,10.3 数组与指针 10.3.1 指向数组元素的指针 定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同.如: int a10; int

10、*p; p=等价. 指针所指元素的地址计算,与数据类型有关(+i:意义因此而异),10.3.2 通过指针引用数组元素 数组名 : 数组的起始地址(常量) 数组元素地址 :数组的起始地址 + 偏移量 若p=等价 例:ai与*(a+i)等价,pi相当于*(p+i),举例 main( ) int a5; int *p= ,输出:&p=ffd8, p=ffce &a=ffce, &a0=ffce, a0=2 *p=2,举例: 指针变量值加1其意义不同 main( ) int i, a3=1, 3, 5; float b3=2,4,6; int *p1=a; float *p2=b; printf(“

11、,注:若a=&a0=ffc4 则a+0=ffc4 , a+1=ffc6 即: a+0&a0 a+1 &a1 若b=&b0=ffca 则b+1=ffce , a+2=ffd2,输出:&a0=ffc4,&b0=ffca,&p1=ffd6,&p2=ffd8 p1=ffc4, *p1=1 p1=ffc6, *p1=3 p1=ffc8, *p1=5 p2=ffca, *p2=2.00 p2=ffce, *p2=4.00 p2=ffd2, *p2=6.00 *(a+2)=5 *(p2+1)=4.00,几点说明: 设 a:数组,p:指针变量,数据类型不同则地址计算也不同 (1) p=a; p+i a+i &

12、ai 实际地址为: a + i * 数组元素所占字节数 如:数组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数组的第

13、i个元素。 其中: a:数组名 p: 指向a 的指针变量 初值p = a,举例:下标法访问数组元素 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,举例:地址法访问数组元素 main( ) int i, a5=55, 66, 77, 88, 99; for(i=0;i5;i+) printf(“(a+%d)=%x,*(a+%d)=%d n”,i,(

14、a+i), i,*(a+i); ,输出: (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,举例:指针法访问数组元素 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=

15、ffd6, *p=99,举例:下标法、地址法指向数组元素 main( ) int i, * p, a5=55, 66, 77, 88, 99; p=a; for(i=0;i5;i+) printf(“p%d=%d,*(p+%d)=%d n” i,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是数组名,其值是数组元素的 首地址,是常量。 (2) 指针变量使用时要注意当前值.,举例: 利用指针变量连续两次输出数组元素 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);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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