




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6 1 6 2 一 变量的指针 即地址 指向变量的指针变量存储在内存储器中的每个数据都是用若干个单元 字节 存放 如一个int型数据占2个单元为能访问这些内存单元 我们给每个内存单元编号 内存单元的编号称为地址 变量的指针 存储变量值 一个数据的若干个单元的首地址 其中第一个单元的地址 例1 intj 153 charc A longm 72561 j的指针为2000c的指针为2002m的指针为2003 指向变量的指针变量例1intj 153 charc A longm 72561 若用变量p存放变量m的指针 则变量p称为指针变量 且可进一步称变量p为指向变量m的指针变量 p的值是m的指针 2003 可用 p表示m 注意 变量的指针与指针变量的区别 变量的指针 本变量的地址指针变量 一个变量 此变量是用来存放另一个变量的指针 不是用来存放一个数据 一 定义指针变量 与以前学的普通变量一样 但变量名前加一个 例如 inta b p x char w c1 c2 定义p为指向int型变量的指针变量 w为指向char型变量的指针变量注意 一个指针变量只能指向所定义的类型变量 如w只能指向char型变量 不能时而指向一个char型变量 时而又指向一个float型变量 至于p w究竟指向哪一个变量 取决于向p w赋予的地址 可认为 p为int型变量 二 指针变量初始化和赋值 指针变量同普通变量一样 使用之前不仅要定义 而且必须赋予具体的值 指针变量的赋值只能赋予指针 地址 决不能赋予任何其它数据 intj 153 k 42 p 定义p与q为指针变量 可认为 p与 q为int型变量 取地址运算符 j表示变量j的指针 注意 1 指针变量初始化的方法 inta p 2 指针变量赋值的方法 inta p p 3 不能把一个数赋予指针变量int ip ip 1800 三 用指针变量表示其所指向的变量即通过指针变量间接访问其所指向的变量 称指针运算符或 间接访问 运算符 若有int p j p 即p指向j则 p表示指针变量p所指向的变量j 可认为 p为int型变量 此 p与j等价 inti j p1 p2 i a j b p1 使p2与p1都指向i 此时 p2与 p1都等价于i p2中内容变化 i 若执行 p2 p1 即执行j i 表示把p1指向的变量i中的内容赋给p2所指向的变量j中 j中内容变化 b a 指针变量可出现在表达式中设intx y px 四 若指针变量p指向普通变量j 即p j 则有1 j j p j2 p p j p j无意义 main floata b p q t p 结果 1 12 8 6 1 2 6 1 12 8 10 1输入3个整数 按由小到大顺序输出main 下面程序的方法由下一页图所示 inta b c t scanf d d d pa scanf d d d pa pb pc if pa pb t pa pa pb pb t if pa pc t pa pa pc pc t if pb pc t pb pb pc pc t printf d d d n a b c main 下面程序的由下一页图所示 inta b c t pa 二 一维数组元素的指针 指向数组元素的指针变量 例inta 5 数组元素的指针 地址 a i或 a i 数组的指针 数组的起始地址 a或 a 0 指向数组元素的指针变量 存放数组元素的指针的变量 注意 例inta 5 中虽然有 a 4 a 3 2 a 2 4 a 1 6 a 0 8但按规定 与上面矛盾 有 a表示 a 0 a 1表示 a 1 a 2表示 a 2 以规定为准 根据指针运算有 a表示a 0 a 1 表示a 1 a 2 表示a 2 进一步规定 若有 inta 5 p a 则p表示 a 0 p 1表示 a 1 p 2表示 a 2 p表示a 0 p 1 表示a 1 p 2 表示a 2 且可用p i 表示 p i 即a i 若有 inta 5 p a 2 或 p a 2 则p表示 a 2 p 1表示 a 3 p 2表示 a 4 p表示a 2 p 1 表示a 3 p 2 表示a 4 p 0 表示 p即a 2 p 1 表示 p 1 即a 3 p 2 表示 p 2 即a 4 若有 inta 5 p a 则表示数组元素a i 1 下标法 即用a i 形式访问数组元素 2 指针法 a i 或 p i 或p i 或第i次执行下面循环体时的 pfor p a p a 5 p p 一 指向数组元素的指针变量定义 初始化和赋值同 一 中一 二main inta 5 15 42 61 12 65 k 2 p1 p2 12 65 42 main a 0 6 inta 3 i p a 1 4p a a 2 2for i 0 i 3 i a 0 6a i 6 2 i a 1 4for i 0 i 3 i a 2 2printf a d d n i a i for i 0 i 3 i printf a d d n i p i 数组a物理结构 数组a逻辑结构 inta 3 4 2 5 1 7 3 9 10 6 4 8 12 11 一 二维数组元素的指针 a i j 或a i j或 a i j根据指针运算 下面二式子表示a i j a i j 或 a i j 特别 a表示 a 0 0 a表示a 0 0 解释 把每行看作一个数组名为a i 的一维数组 a i j 看作一维数组a i 的元素 则可用a i j表示 a i j 把数组a看作一维数组 其数组元素为a i 则可用 a i 表示a i 进一步a i j可用 a i j表示 a表示 a 0 0 a 3表示 a 0 3 a 4表示 a 1 0 a 5表示 a 1 1 即 a 4 i j表示 a i j a 4 i j 表示a i j j 列数 1 此4为二维数组的列数 指向二维数组元素的指针变量 用来存放二维数组元素的指针 的定义 初始化 赋值同 一 一 二 若inta 3 4 2 5 1 7 3 9 10 6 4 8 12 11 则有 p a q p表示 a 0 0 p或p 0 表示a 0 0 p 1表示 a 0 1 p 1 或p 1 表示a 0 1 p 2表示 a 0 2 p 2 或p 2 表示a 0 2 p 3表示 a 0 3 p 3 或p 3 表示a 0 3 p 4表示 a 1 0 p 4 或p 4 表示a 1 0 若inta 3 4 2 5 1 7 3 9 10 6 4 8 12 11 p a q 则有 q表示 a 1 2 q或q 0 表示a 1 2 q 1表示 a 1 3 q 1 或q 1 表示a 1 3 q 2表示 a 2 0 q 2 或q 2 表示a 2 0 q 3表示 a 2 1 q 3 或q 3 表示a 2 1 把二维数组a中数据排序 从小到大 voidmain intt i j inta 2 4 1 6 3 8 2 9 5 0 p p a 0 0 可用 a代替 p i 可用 p i 代替 for i 0 i 1 i for j 0 j 3 j printf 5d a i j printf n main inta 3 4 2 5 1 7 3 9 10 6 4 8 12 11 若要按如下方式排序 应如何处理 inta 3 4 2 5 1 7 3 9 10 6 4 8 12 11 数组a逻辑结构 二 二维数组的行指针 a i 或a i指向行的指针变量 用来存放行指针的指针变量解释 把每行看作一个数组名为a i 的一维数组 进一步把每行看作一个数组元素a i 从而把数组a看作一个一维数组 数组元素分别为 a 0 a 1 a 2 行指针 a 0 a 1 a 2 的指针注意 a i 是由下面构成的整体a i 0 a i 1 a i 2 a i 3 注意 1 每行第一个数组元素的指针为 a i 0 或a i 或 a i 2 行指针 1与数组元素指针 1区别行指针 1表示下一行的行指针数组元素指针 1表示下一个数组元素的指针 对行指针进行一次指针运算便得到它们 指向行的指针变量 存放二维数组的行指针 定义 初始化和赋值 int h2 4 a 3 4 2 5 1 7 3 9 10 6 4 8 12 11 h1 4 a 1 h2 h2 则可用 h2表示 a 0 0 h2 1表示 a 0 1 h2 5 表示a 1 1 h2 2 1表示 a 2 1 h1 a 1 h1表示a 1 0 h1 2 表示a 1 2 h1 7表示 a 2 3 h1 1 3 表示a 2 3 voidmain int p 4 i j a 3 4 0 1 2 3 4 5 6 7 8 9 10 11 p a for i 0 i 3 i for j 0 j 4 j printf 4d p i j printf n 01234567891011 此可用a代替 它常用来表示a i j 三 注意 1 可以改变指针变量p的值 禁止改变数组名a的值 形参除外 如p 是合法的 而a 是错误的 因为a是数组的首地址 是常量 2 p 等价于 p 由于 和 同优先级 结合方向自右而左 p 与 p 作用不同 若p的初值为a 则 p 等价a 0 p 等价a 1 执行后p值均为 a 1 3 p 表示p所指向的元素值加1 执行后p值不变 4 要注意指针变量的当前值例找出错误 voidmain int p i a 5 p a for i 0 i 5 i p i for i 0 i 5 i printf a d d n i p 结果 a 0 4080a 1 256a 2 1a 3 4076a 4 3079 红杏出墙 修改voidmain int p i a 5 p a for i 0 i 5 i p i p a for i 0 i 5 i printf a d d n i p a 0 0a 1 1a 2 2a 3 3a 4 4 加上此语句后结果为 5 从上例可以看出 虽然定义数组时指定它包含5个元素 但指针变量可以指到数组以后的内存单元 系统并不认为非法 P166 6 3字符串与指针字符 单个 且与 整数 一样处理一 字符串 1 连续存放且系统会自动在字符串末尾加一个字符 0 它ASCII码为0 2 任一个变量或数组元素只能存放字符串中一个字符 一个字符串一般存放在一个一维字符数组中或二维字符数组的某行中 voidmain chard 7 ruler 下面程序与上面等价voidmain chard 7 r u l e r 0 自动加 0 此数必须 6 也可以不填 voidmain chara 4 5 hi book box also 若只对字符数组部分元素初始化则未被初始化的元素系统自动将其赋值为0 0 的ASCII码是0 3 字符串表示 首地址 字符串中第一个字符的指针 另字符串本身 例 book 也可充当首地址角色 计算机处理字符串是从它的首地址处的字符开始 依次下一个 直至第一个 0 为止 不包括 0 二 字符串的输入输出1 printf 和puts 输出字符串时对应项用字符串的首地址表示 例1 将一个单词逆序 然后输出voidmain charc 10 pencil t intn k n strlen c for k 0 k n 2 k t c k c k c n 1 k c n 1 k t printf s n c 上一页程序可以改写为voidmain charc 10 pencil t intn k n strlen c for k 0 k n 2 k t c k c k c n 1 k c n 1 k t for k 0 c k 0 k printf c c k printf n printf s n c 可用下面程序段代替 char p c while p 0 printf c p printf n printf c p 与putchar p 等价 输出字符串中第10个字符及其后面的所有字符voidmain charps thisisabook intn 10 printf s n ps n 结果book 禁止改变字符数组名ps的值即不允许出现类似ps ps 10 的语句 voidmain chara 4 5 hi book box also char t a for t a 3 t 5 puts t 上一页程序可以改写为voidmain chara 4 5 hi book box also intk j for k 0 k 3 k for j 0 a k j 0 j printf c a k j printf n 此可用 0 代替 2 输入字符串方法例 从键盘输入1个字符串存到数组c中 charc 10 for k 0 c k getchar n k c k 0 charc 10 scanf s c 或gets c 若输入pen 则c 0 值为 p c 1 值为 e c 2 值为 n c 3 值为 0 例 输入2个字符串存到数组c1 c2中voidmain charc1 10 c2 10 scanf s s c1 c2 输入penbook c1 c2 c1 c2 voidmain charc1 10 c2 10 gets c1 gets c2 若输入penbook ruler 输入第一个回车符后计算机继续要求用户输入字符串 P171 6 3 3指向字符串的指针变量voidmain char ps thisisabook ps ps 10 printf s n ps 结果book 此允许改变ps的值 6 3 4字符数组与字符指针变量的对比charps thisisabook 把字符串存放在一维字符数组ps中char ps thisisabook 把字符串首地址存放在字符指针变量ps中即让字符指针变量ps指向字符串至于字符串存放在哪里 由系统分配 6 4 2指向指针的指针变量 p186 指向指针的指针变量 它用来存放另一指针变量的地址若 inta p q q 则q称为指向变量a的指针变量p为指向指针变量q的指针变量指向指针的指针变量主要用来指向指针数组的元素 inta p q q 在前面已经介绍过 通过指针访问变量称为间接访问 即用 q表示a由于指针变量q直接指向变量 所以称为 单级访问 而如果通过指向指针变量的指针来访问变量则构成 二级访问 即用 p表示a因为 p p q a 定义指向指针的指针变量 与以前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 理清思路的市政工程考试试题及答案
- 家庭农场农产品直销市场准入协议
- 酒店旅游业智能化服务与运营方案
- 商场工装室内装修施工协议
- 软件测试及优化策略实施方案
- 市场营销客户关系管理测试卷
- 电子政务公共服务信息化管理平台建设方略
- 行政管理与社会责任传播试题及答案
- 深刻理解的2025年工程经济试题及答案
- 水电站业务技术考试试题及答案
- 2025医院护理面试题库及答案
- 餐厅供餐协议书范本
- 供水公司笔试试题及答案
- 安徽省粮油经贸有限公司招聘笔试真题2024
- 基于单片机的电饭煲设计
- 大棚改造施工合同协议
- 食堂员工培训
- 2025年上海中考复习必背英语考纲词汇表默写(汉英互译)
- 饲料与饲料学试题及答案
- 2025至2030中国磷石膏市场行情走势监测及未来发展展望报告
- 国家发展改革委低空经济司
评论
0/150
提交评论