二级必过之chap8指针

上传人:油条 文档编号:47549628 上传时间:2018-07-02 格式:PPT 页数:84 大小:825KB
返回 下载 相关 举报
二级必过之chap8指针_第1页
第1页 / 共84页
二级必过之chap8指针_第2页
第2页 / 共84页
二级必过之chap8指针_第3页
第3页 / 共84页
二级必过之chap8指针_第4页
第4页 / 共84页
二级必过之chap8指针_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《二级必过之chap8指针》由会员分享,可在线阅读,更多相关《二级必过之chap8指针(84页珍藏版)》请在金锄头文库上搜索。

1、C 程序设计基础教程第八章第八章 指指 针针8.1 指针的概念 8.2 指针的运算 8.3 指针与数组8.4 指针变量作为函数参数8.5 返回指针值的函数8.6 指向函数的指针Date1C 程序设计基础教程 8.1 8.1 指针的概念指针的概念 通过指针,可以更好地利用内存资源;描述复杂 的数据结构;更灵活地处理字符串和数组等等。使 用指针可以设计出简洁、高效的C语言程序。指针的概念及使用有一定难度。指针被用来表示内存单元的地址,如果把这个地 址用一个变量来保存,则这种变量就称为指针变量 。 内存是计算机用于存储数据的存储器,以一个字节 作为存储单元,为了能正确的访问内存单元,必须 为每一个内

2、存单元编号,这个编号就称为该单元的 地址。 Date2C 程序设计基础教程8.1.1 地址和指针指针的概念内存单元 地址 内容 变量int x = 20, y = 1, z = 155; printf(“%d“, x;)直接访问:通过变量名访问间接访问:通过另一个变量访问 把变量的地址放到另一变量中 使用时先找到后者 再从中取出前者的地址1000 20 x 1002 1 y 1004 155 z2000 1000 p 2002地址 指针变量Date3C 程序设计基础教程指针内存单元 地址 内容 变量int x = 20, y = 1, z = 155; printf(“%d“, x;)1000

3、 20 x 1002 1 y 1004 155 z2000 1000 p 2002地址 指针变量指针变量:存放地址的变量某个变量的地址指向Date4C 程序设计基础教程指针变量所指向的变量的类型 int *p; p 是整型指针,指向整型变量 float *fp; fp 是浮点型指针,指向浮点型变量 char *cp;cp 是字符型指针,指向字符型变量类型名 * 指针变量名指针声明符8.1.2 指针变量的定义Date5C 程序设计基础教程指针变量的定义类型名 * 指针变量名 int * p;指针变量名是 p,不是*p* 是指针声明符int k, *p1, *p2; 等价于: int k; int

4、 *p1; int *p2; Date6C 程序设计基础教程指针变量是用来保存某个变量的地址的,而地址是内 存单元的编号, 因此指针变量的值的数据类型是无 符号的整型。 8.1.2 指针变量的使用 指针变量一旦定义,必须采用赋值的方式将其与某个 变量实体相联系,才能使用。 指针变量的赋值方式: 指针变量名 p= 或: int i , *p=i; 两种形式都是将变量i的地址赋给了指针p。 *指针变量名普通变量名; Date7C 程序设计基础教程指针变量的引用方式为: *指针变量名代表所指变量的值。 指针变量名代表所指变量的地址。例如:int i, *p;float x, *t;p=t=*p=3;

5、 /*相当于i=3 */*t=12.34; /*相当于x=12.34 */在上面的表达式中,p、 p = 把 a 的地址赋给 p,即 p 指向 a指针变量的类型和它所指向变量的类型相同Date10C 程序设计基础教程例 8.1 寻找保险箱密码 一个关于特工008寻找保险箱密码的故事 关键点分析 得到线索:0217单元的“湘江号”寄存箱 提示地址:1976单元 找到目标:“麓山号”寄存箱 取出内容:911Date11C 程序设计基础教程8.1 寻找密码的途径分析n密码911存放在某个寄存箱内,如果我们 知道这个寄存箱的名字,就能够找到密码 n如果不知道密码所在的寄存箱名字,知道 该寄存箱的地址也

6、照样能够取出密码 n如果寄存箱的地址也不知道,但是有另外 一个地方存放这个寄存箱的地址,就能顺 藤摸瓜,间接找到密码Date12C 程序设计基础教程8.1 密码存放示意图麓山号9111976湘江号19760217名字湘江号麓山号地址02171976内容1976911Date13C 程序设计基础教程例8-1 利用指针模拟寻找保险箱密码的过程 获取密码的两种方法 int main(void) int key = 911; /* 变量key存放密码 */ int *addr ; /* 变量addr存放地址 */addr = /* 将key的地址赋给addr */* 通过变量key输出密码值*/pri

7、ntf(“The key is: %dn“, key); /* 通过变量key的地址来输出密码值 */printf(“If I know the address of the key, I also can get it: %dn“, *addr);return 0; The key is: 911If I know the address of the key, I also can get it: 911 Date14C 程序设计基础教程# include int main (void) int a = 3, *p; p = printf (“a=%d, *p=%dn”, a, *p);*

8、p = 10; printf(“a=%d, *p=%dn“, a, *p);printf(“Enter a: “);scanf(“%d“, printf(“a=%d, *p=%dn“, a, *p);(*p)+;printf(“a=%d, *p=%dn“, a, *p);return 0; 例8-2指针取地址运算和间接访问运算 a 3 定义指针变量 p*p =10; 指针p所指向的变量,即a(3) p = x = *p+;Date16C 程序设计基础教程b 2int *p1, *p2;p1 = p2 = printf (“a=%d, b=%d, *p1=%d, *p2=%dn“, a, b,

9、*p1, *p2);t = *p1; *p1 = *p2; * p2 = t;printf (“a=%d, b=%d, *p1=%d, *p2=%dn“, a, b, *p1, *p2);return 0; 例8-3 通过指针改变变量的值a = 1, b = 2, *p1 = 1, *p2 = 2 a = 2, b = 1, *p1 = 2, *p2 = 1 Date17C 程序设计基础教程2、赋值运算a 3 p1 = 把 a 的地址赋给 p1,即 p1 指向 a p2 = p1; p2 也指向 a相同类型的指针才能相互赋值Date18C 程序设计基础教程b 4a = 2; b = 4; c

10、= 6;p1 = p2 = printf (“a=%d, b=%d, c=%d, *p1=%d, *p2=%dn“, a, b, c, *p1, *p2);p2 = p1; p1 = printf (“a=%d, b=%d, c=%d, *p1=%d, *p2=%dn“, a, b, c, *p1, *p2); return 0; *p2*p1a = 2; b = 4; c = 6; *p1 = 2, *p2 = 4 a = 2; b = 4; c = 6; *p1 = 6, *p2 = 2 Date19C 程序设计基础教程例8-5 int main (void ) int a=1, b=2;

11、 int *p1 = printf (“a=%d, b=%d, *p1=%d, *p2=%dn“, a, b, *p1, *p2);pt = p1; p1 = p2; p2 = pt;printf (“a=%d, b=%d, *p1=%d, *p2=%dn”, a, b, *p1, *p2);return 0; 8.1.5 指针变量的初始化p1b 2 b = 2; *p1 = 1, *p2 = 2 a = 1; b = 2; *p1 = 2, *p2 = 1Date20C 程序设计基础教程 8.2 8.2 指针的运算指针的运算 8.2.1 指针的算术运算 指针的算述运算通常只限于和,或和 。

12、、代表指针向前移。 、代表指针向后移。设p、q为某种类型的指针变量,n为整型变量。 则:p+n、p+、+p、p-、-p、p-q的运算结果仍为 指针,而p-q的值为正值。Date21C 程序设计基础教程【例86】阅读下面的程序,了解指针的值的变化 。/*exam8_3 了解指针的值的变化*/ #include main() int i=0,*pi= float f=0,*pf= long l=0,*pl= printf(“pi=%lu,pi+1=%lun“,pi,pi+1); printf(“pi=%lu,pi-1=%lun“,pi,pi-1); printf(“pf=%lu,“,pf); pf

13、+; printf(“pf+=%lun“,pf); printf(“pl=%lu,“,pl);Date22C 程序设计基础教程pl-; printf(“pl+=%lu,“,pl); 程序运行结果:pi=358944766,pi+1=358944768pi=358944766,pi-1=358944764pf=358944758,pf+=358944762pl=358944750,pl-=358944746,Date23C 程序设计基础教程8.2.2 指针的关系运算 两指针之间的关系运算是比较两个指针所指向 的地址关系, 只有两种,即相等和不相等。当两个指针p1与p2指向同一地址时,p1=p2为

14、真,当两个指针p1与p2不指向同一地址时,p1!=p2为真 。Date24C 程序设计基础教程8.3.1 指向一维数组的指针 例:int a10, *p;p= / 将a0元素的地址赋给指针变量p /在C中,数组名代表数组的首地址。因此p=a ; 与 p=是等价的。 注:p = a ; 是将a 数组的首地址赋给指针变量p。 但这里的a 并不代表整个数组。可以通过指针引用数组元素8.3 指针与数组Date25C 程序设计基础教程8.3.1 数组和地址间的关系int a100, *p; 数组名代表一个 地址,它的值 是数组首元素 的地址(基地 址) a+i 是距数组a的 基地址的第i个 偏移3000 a0地址 内容 数组元素3002 a13198 a99aia a+1a+99a+ifor(i = 0; i int main(void) int i, a10, *p;long sum = 0;printf(“Enter 10 integers: “);for(i = 0; i main() int a22=1,2,3,4,*p1,(*p2)2;p1=a0;p2=

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

当前位置:首页 > 行业资料 > 其它行业文档

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