第7章 指针(指针数组)

上传人:飞*** 文档编号:2456285 上传时间:2017-07-24 格式:PPT 页数:74 大小:1.02MB
返回 下载 相关 举报
第7章 指针(指针数组) _第1页
第1页 / 共74页
第7章 指针(指针数组) _第2页
第2页 / 共74页
第7章 指针(指针数组) _第3页
第3页 / 共74页
第7章 指针(指针数组) _第4页
第4页 / 共74页
第7章 指针(指针数组) _第5页
第5页 / 共74页
点击查看更多>>
资源描述

《第7章 指针(指针数组) 》由会员分享,可在线阅读,更多相关《第7章 指针(指针数组) (74页珍藏版)》请在金锄头文库上搜索。

1、1深刻理解并掌握指针的概念。2掌握指针变量的定义和应用,指针变量作为函数参数的用法。3掌握指向数组的指针与指向数组的指针变量的概念、定义和应用。4掌握指向字符串的指针的定义和应用。5理解指向函数的指针的定义和用法。6了解返回指针值的函数的定义和应用,了解它与指向函数的指针变量的区别。7了解指针数组的定义和应用,掌握指针的指针的定义和应用,了解它指针数组与指向数组的指针变量的区别。,第7章 指针,7.2 指针的定义、 使用和运算,7.1 地址和指针的概念,第7章 指针,7.4 数组和指针,1. 一维数组和指针,2. 多维数组和指针,3. 用指针处理字符串,1. 指针的定义,2. 指针的操作,3.

2、 针变量的初始化,7.3 函数与指针,1. 指针作为函数参数,2. 返回指针的函数,4. 函数体内的指针,4. 指针数组,7.7 小结,结束,3. 函数指针,7.6 指针实例,7.5 动态存储管理,1. 存储管理函数,2. 函数的使用, 7.1 地址和指针的概念 ,7.1 地址和指针的概念(P136) 变量与地址 内存地址计算机内存的组织方式是把所有单元顺序排列, 每个单元 (字节) 有一个顺序编号, 称单元的地址或称为指针。数据的存取是在内存地址所标识的存储单元中进行的。内存单元的地址与内存单元中的数据是两个完全不同的概念。 变量地址系统分配给变量所需的内存单元的起始地址。, 7.1 地址和

3、指针的概念 ,变量是对程序中数据存储空间的抽象 变量建立后, 意味着为其指定了一个存储位置, 分配了存储变量值所需要的存储单元。变量值的存取通过变量在内存中的地址进行任何变量在其存在期间总有一个确定的、固定的存储位置, 即固定的地址。变量地址可作为数据来操作。,程序中: int i ; float k;,编译或函数调用时为其分配内存单元,i,k,内存中每个字节有一个编号- 地址, 7.1 地址和指针的概念 ,指针与指针变量指针 一个变量的地址指针变量 专门存放变量地址的变量,整型变量 i,10,变量 i 的地址,变量 i 的内容,指针,变量 p,2000,变量 p 的内容,指针变量, 7.1

4、地址和指针的概念 ,变量值的存取 直接存取 一般情况下, 在程序中对变量进行存取操作, 实际上就是对某个地址的存储单元进行操作, 只不过变量和具体地址的联系由编译系统完成, 用户无须知道变量在内存中的具体地址, 这种直接按变量地址存取变量值的方式称 “直接存取”。例 scanf(%d,&i) 的执行过程是这样的: 找到变量 i 的起始地址 2000; 然后将键盘输入的值10 送到内存单元 2000 和 2001 中。例 printf(%d,i)的执行过程与scanf()很相似: 首先找到变量 i 的起始地址2000, 然后从 2000 和 2001 中取出其值,最后将它输出。, 7.1 地址和

5、指针的概念 ,间接存取 指针变量也是变量,也有自己的存储地址,设指针变量 p 的存储单元中放的是变量 i 的地址, 这时要访问 i, 可以先找到变量 p 的地址, 从中取出 i 的地址, 再去访问 i 的内容, 这种通过变量 p 间接得到变量 i 的地址, 然后再存取 i 的值的方式称 “间接存取”。 指针机制是一种间接访问其他对象的手段, 目的是为了更加灵活方便地对数据进行操作。, 7.1 地址和指针的概念 ,说明指针变量的赋值操作有特殊的意义, 由于指针变量的值只能是其他对象的地址, 指针变量赋值就是把某个变量的地址赋给指针 (这个过程称指针指向变量), 因此, 在程序运行的不同时刻, 指

6、针可以指向不同的变量。指针的应用使程序代码更简洁、更高效。但使用指针会降低程序的可读性, 使用不当, 可能造成严重的错误甚至引起系统崩溃。C语言编译器对指针的检查较弱, 查错比较困难,要求程序员控制指针的有效性。从程序设计角度讲, 更应该注意用普通变量无法实现只有用指针才能实现的功能和机制, 如改变调用函数环境的值等。, 7.2.1 指针的定义 7.2 ,7.2 指针的定义、使用和运算 指针的定义 一般形式 定义指针变量的一般形式 类型名 *指针变量1, *指针变量2, ; 说明指针变量的值 为某个内存单元的地址值(地址编号)。值的类型均为整型。通过指针访问的对象有类型 C 语言规定,任何一个

7、指针变量, 只能指向具有某种特定类型的变量。定义中的类型名限定了指针变量可以关联的对象的范围。指针变量也是变量 像普通变量一样可以赋值、取值等。但要满足类型约束。,例如:int *p1; 定义指向整型变量的指针变量 p1, 也叫整型指针。float *p2;定义指向浮点型变量的指针变量 p2 ,也叫浮点指针。char *s; 定义指向字符的指针变量 s,也叫字符指针。int *p, n; a10 ; 指针变量可和其他变量一起定义 注意: 不可省略,否则变成普通变量的定义,注意: 1. int *p1, *p2; 与 int *p1, p2; 2. 指针变量名是 p1, p2 , 不是 *p1,

8、*p2 3. 指针变量只能指向定义时所规定类型的变量 4. 指针变量定义后, 变量值不确定, 应用前必须先赋值, 7.2.1 指针的定义 7.2 ,空指针 定义 空指针是一个特殊的指针,它的值是0 说明0 的符号常量 为 NULL(在 stdio.h中定义),系统保证这个值不会是任何变量的地址空指针对任何指针类型赋值都是合法的 一个指针变量具有空指针值, 表示当前它没有指向任何有意义的值。用 p = NULL ( 比 p = 0 ) 的形式为好。 p = NULL与未对 p 赋值不同。 用途:避免指针变量的非法引用在程序中常作为状态比较, 7.2.1 指针的定义 7.2 ,void 指针定义

9、(void*) 类型的指针叫通用指针, 它可以指向任何变量, C语言允许直接把任何变量的地址作为指针赋给通用指针。说明通用指针不能做间接运算 因为编译系统无法确定它所指的变量的类型。使用通用指针需要进行类型强制转换。如: (void *) gp 所指空间的数据是整型数据, p 是整型指针, 用下式转换: p = (int *) gp;, 7.2.1 指针的定义 7.2 ,指针转换实际上没有带来指针值的任何变化, 一个指针类型代表一种观点。 如通过整型指针的间接使用, 永远把被指的东西看成整型。通用指针对被指的内容不提供任何有意义的类型信息, 所以不能通过这种指针间接使用被指的内容。指针转换是一

10、种观点转换,转换成哪种类型的指针,就用哪种类型去解释被指的变量。通用指针的惟一用途就是提供一个指针值。可以看成内存中一个字节一个字节的地址, 没有具体类型。, 7.2.2 指针的操作 7.2 ,指针的操作指针赋值 一个指针变量可以通过不同的方法获得一个确定的地址值, 从而指向一个具体的对象: 取地址运算 (一元运算符&) 和指针赋值&放在变量名前面。效果是取得该变量的地址, 得到一个该变量类型规定的指针值; 例如:若有定义 int x, *p; 把 p&x;把 x 的地址赋予 p,即 p 指向了变量 x。&运算符只能应用于变量和数组元素, 不可用于表达式、常量或 register 变量。sca

11、nf 要求输入项是地址值。若p&x; 则 scanf(%d,&d)和scanf(%d,p)是等价的, 7.2.2 指针的操作 7.2 , 指针变量赋值 通过指针变量赋值, 把一个指针变量的地址值赋给另一个指针变量, 使这两个指针变量指向同一地址。赋值号两边的指针变量的基类型必须一样。例如: p 和 q 都是整型指针, p指向整型变量, 则执行 q=p 以后, q 也指向变量 x 通过标准函数获得地址值 可以通过调用库函数 malloc 和 calloc 在内存中开辟动态存储单元, 并把单元地址赋值给指针变量。, 7.2.2 指针的操作 7.2 ,间接运算(一元运算符 “*”) 将一元运算符 *

12、 放在指针变量名前(也可是地址前), 效果是由一个指针得到被它指向的变量, 可以像使用普通变量一样使用该表达式。 例如: int m, *p, *q , n ; p=&n; q&m; 则: *q 相当于 n, *q 相当于 m。 间接使用:m = *p+*q 作用与 m = n+m 相同。 间接赋值:*p = 5, 作用与 n = 5 相同。 显然:*p 出现在赋值号左边, 代表指针所指的存储单元, *p 出现在赋值号右边, 代表指针所指的存储单元的内容。,【例 7.1】设 int *p, k = 0; p=&k; 分析下面几行程序执行的过程和结果。*p = 100; /* 把整数 100 赋

13、给 k 变量 */*p =*p+1;/* 取 p 所指单元的值, 加 1 后,赋给 p 所指的存储单元, k 变为 101 */*p += 1; /* 等价于 k+= 1; k变为 102 */+ *p; /* 等价于 +k, k 变为 103 */(*p)+; /* 等价于(k)+, k 变为 104 */, 7.2.2 指针的操作 7.2 ,移动指针 将移动指针就是对指针变量加上或减去一个整数, 或通过赋值运算使指针变量指向相邻的存储单元。因此, 只有当指针指向一串连续的存储单元时, 指针移动才有意义。对指针进行 +、- 运算中, 数字 “1” 不再代表十进制数 “1”, 而是 1 个存储

14、单元长度, 如果整型变量存储单元长度是 2 个字节, 整型指针移动 1 个存储单元就是移动 2 个字节, 双精度型指针加 1 就是移动 8 个字节, 依此类推。程序中移动指针时, 不论指针的基类型是什么, 只需简单地加、减一个数而不必去管它的具体长度, 系统将会根据指针的基类型自动确定位移的字节数。, 7.2.2 指针的操作 7.2 ,最常用的移动操作就是加一 (+) 和减一 (-) 操作。它们分别代表指针向地址值增大的方向移动一个存储单元和指针向地址值减少的方向移动一个存储单元。两个指向同一串连续单元的指针可以进行相减的运算, 结果是两个指针之间元素的个数, 可以通过赋值使两个指针指向同一个

15、单元。,【例7.2】设 p, q 是指向一片连续整数空间的整型指针, p 指向第一个整数, q 指向最后一个整数, a 是整型变量, 顺序执行下面的操作, 分析操作的意义和结果。+p ;/* 指针 p 后移 1 个存储单元,指向第二个整数 */q-;/* 指针q前移1个存储单元, 指向倒数第二个整数 */a=*p+;/* 取出 P 所指单元内容赋给 a, 指针 P 后移 1 个存储单元, 指向第三个整数 */a=q-p; /* 计算 q 和 P 之间整型数个数将它赋给 a */p=q- ; /* 将 p 指向 q 所指单元,指针 q 前移 1 个存储单元, 指向倒数第三个整数 */*p=10/2; /* 计算 10/2 的值, 赋给 p 所指单元 */,

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

最新文档


当前位置:首页 > 办公文档 > 活动策划

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