华中科技大学光电子学院C语言课件第七章.ppt_第1页
华中科技大学光电子学院C语言课件第七章.ppt_第2页
华中科技大学光电子学院C语言课件第七章.ppt_第3页
华中科技大学光电子学院C语言课件第七章.ppt_第4页
华中科技大学光电子学院C语言课件第七章.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第七章指针1 指针与数组的关系2 指针与函数的关系 1 指针及定义一 指针变量的定义指针变量 存放对象地址的变量 指针变量定义的基本形式 类型说明符 变量名 例 int pi pj pi pj指向整型变量的指针变量 float p3 p3是指向浮点型变量的指针变量 注 1 定义指针变量的物理意义 机器给指针变量分配内存单元 此单元只能存放对象的地址 2 2 指针类型是指针所指对象的类型 指针本身没有类型 例 int fpi a 10 pa 10 复杂变量的指针 fpi是一个整型指针函数 函数返回值是指向int变量的指针 a是含有10个元素的整型指针数组 每个元素是一个指向int变量的指针 pa是指向含有10个int元素的数组的指针 3 二 指针变量的运算符 指针变量运算符 间接取对象的内容 取操作对象的地址 都是一目运算符 例 int p p1 t t1 p 将0送p指向的t单元中 即t 0 4 例 inti j p 1 i 123 2 p 表达式 r a 0 a 1 是正确的 2 r a k是非法的 2 与 直接寻址 访问c 三 指针运算1 赋值运算1 同类型的指针变量可以相互赋值 指向同一类型的对象 int p1 p2 a p1 7 4 两种特殊指针 void指针和NULL指针void指针 指向空值类型的指针变量 可以与任何类型指针变量相互赋值 不需要强制类型转换 如 int p void p1 p p1 p1 p NULL指针 具有整数0值的指针 即不指向任何对象的指针NULL符号常量 在有定义 或用 defineNULL0定义 void f f是无参数的指针函数 void pa 8 例 main int p1 p2 p a b scanf d d 9 2 算术运算仅限于加法和减法1 指针变量加 减 一个整数 int p p1 p 访问p后 p从当前位置向后移一个单元的数据 p 访问p后 p从当前位置向前移一个单元的数据 p 访问p前 p从当前位置向前移一个单元的数据 p 5 指向p当前所指数据后面第5个单元的数据 2 同类型指针变量之间仅只能相减 结果为整数 不为指针 大小为相隔的字节数 如 上面p p1 注 不允许两指针变量相加 乘除 移位 屏敝运算 以及float或double数与指针相加运算 10 例 用指针定义求字符串长度的函数intstrlen char s char p s while p 0 p return p s 3 关系运算两个指针指的类型相同 可以进行比较 q若值为非0 则p所指的数据位于q所指的数据之前 反之为0指针变量不能与常量比较 但常量0 NULL 可与任何类型的指针变量作 或 的比较 11 2 指针与数组指针与数组有密切关系 任何由数组下标完成的操作 都可由指针实现 一 一维数组的指针表示例 inta 10 pa pa 或pa a 0 指针指向数组的首址规定 pa 1指向a 1 a 1 第1个元素pa 2指向a 2 a 2 第2个元素 pa i指向a i a i 第i个元素故 pa i 或 a i 就是a i 的内容 12 注 1 当指针变量指向数组首址后 以下标为i的数组元素引用的方法有3种 指针变量 i 数组名 i 数组名 i 指针法数组元素法 2 数组名与指针之间有区别 指针是变量 数组名是地址常量如 pa a pa 是有意义的操作a pa a pa 都是非法的 访问一个数组元素 可用下标法 a i 也可用指针法 p i 或 a i 1 下标法 main inti min max a 10 for i 0 imax max a i elseif a i min min a i printf max d min d n max min 例 求整型数组a 10 中的最大值和最小值 2 用数组名访问元素main inti min max a 10 for i 0 imax max a i elseif a i min min a i printf max d min d n max min 3 用指针间接访问main int p min max a 10 p a for pmax max p elseif p min min p printf max d min d n max min 注 1 指针变量的定义和没有指明长度的数组视为一样例 在函数定义中 参数说明 f chars f char s 2 在C语言中 只要出现未加下标的数组名 字符串常量名 结构名 联合名或不带参数的函数名 都可以解释成指针 因此可同指针变量一样置初值3 指针与字符串 字符数组 如 chars It sastring char s It sastring 但有区别 如 char p 指向一个字符的指针变量 p It sastring 指向字符串的串首址 scanf s p 错误 没有为p所指的对象分配空间 又如 chars s It sastring 错误s为地址常量 例 lenth s 计算s的长度 chars intn for n 0 s n 0 n return n lenth s char s intn for n 0 s 0 n return n includemain staticchars1 abcdef 等价于char s1 abcded intstring string lenth s1 等价于string lenth 例 把字符串t复制到字符串s中的函数strcpy s t 用指针strcpy s t char s t while s t 0 用数组strcpy chars chart inti for i 0 s i t i 0 s i t i 二 指针与多维数组1 二维数组元素的表示例 inta 2 3 1 2 3 4 5 6 1 下标表示 元素的地址表示 a i j 取地址 元素的内容表示 a i j 2 元素的数组名表示例 inta 2 3 1 2 3 4 5 6 数组名a被看成由元素a 0 a i 的一维数组 但a 0 又可看成包含3个元素a 0 0 a 0 1 a 0 2 一维数组a 1 又可看成包含3个元素a 1 0 a 1 1 a 1 2 一维数组即 根据C语言规定 数组名代表数组的首地址 因此 a代表二维数组的首址 即第0行的首址 a 1 代表第一行的首址同理 a 0 为另一个一维数组的首址 即第0行第0列元素的首址 即 a 0 是a 1 2是 a 1 2 即 a i j 元素的地址用数组名表示 a i j 或 a i j与二维数组地址 a i j 一样a i j 元素值用数组名表示 有以下几种等价形式 a i j a i j a i j 数组名与下标混合表示 或 a 0 0 2 i j 注 inta 2 3 例 编程用指针变量输出数组元素的值 main inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 int p for a 0 p a 0 12 p if p a 0 4 0 printf n 一行输出4个数据 printf 5d p 3 指向数组指针变量的定义如 int pa 3 a 2 3 指针变量pa指向3个元素的数组 pa a 使pa指向数组a的第0行 注 int pa 3 与int pa 3 不同 后者为由三个指针组成的指针数组 例 上例 main inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 int p 4 j for p a p a 3 p for j 0 j 4 j printf 5d p j printf n 2 多维数组的指针表示三维及以上的数组用指针表示比较复杂 一般采用下标表示元素法比较好 3 指向二维数组的指针变量的使用1 指针变量指向二维数组的某个元素定义时 指针变量 inta 2 3 p a 或 p 24 for i 0 i 2 i printf for j 0 j 3 j p 2 指针变量指向二维数组的首地址定义时 指针变量 二维数组名 指针变量 三数组名 0 0 引用时 指针变量 二维数组名指针变量 二数组名 0 0 3 指针变量指向二维数组中的某一个一维数组 P a 或p 25 定义时 指针变量 m 二维数组名 m为列长 引用时 指针变量 二维数组名数组元素的地址引用 指针变量 行下标 列下标数组元素的内容引用 指针变量 行下标 列下标 例 上例 main inta 2 3 p 3 a inti j for I 0 i 2 i for j 0 j 3 j scanf d p i j 或 a i j for i 0 i 2 i printf for j 0 j 3 j printf 5d p i j 或 a i j 三 指针数组和命令行处理由指针变量组成的数组1 指针数组说明的一般形式 类型标识符 数组名 常量表达式 例 int a 4 注 1 a 4 是指针数组而 p 4 是指向数组的指针变量2 指针数组主要用于字符串数组的处理和命令行参数的处理因为字符串数组中每一个字符串不等长 例 输入一个表示月份的整数 输出该月份的名字main intn char month Illegalmonth Jan Feb March April May June July Aug Sep Oct Nov Dec printf Inputnumberofmonth n scanf d 2 命令行参数的处理命令行带有任选变元或参数称为命令行参数 如 c echohelloworld 操作系统下的命令行 发布命令行的时刻 在操作系统下执行时如何将命令的参数接收到程序中 方法是 通过函数main argc argv 中argc argv传送给程序 其中 argc 计算命令行中参数的个数argv 指针数组 每个元素是指向包含这些参数 字符串 的指针 如 c echohelloworldargc 3argv 0 echo argv 1 hello argv 2 world 参数argc argv的定义 main argc argv intargc char argv 或char argv 注 1 argc和argv位置不能颠倒2 argc和argv的初始化 由键入的命令 包括命令字 的个数决定 例 编一命令行执行程序 c echowhatdayistoday 输出命令行参数 whatdayistaday main argc argv intargc char argv while argc 0 printf s c argv argc 1 n 编译echo c生成echo exe文件 在dos状态下执行c echowhatdayistoday 显示 whatdayistoday 它告诉我们 可在操作系统状态下 利用程序 接收字符串 然后处理这些串 例如 输入 c day22001 设计程序day c 接收月份 年份 显示该月的天数 四 指向指针的指针变量定义形式 类型标识符 标识符例 char p 相当于 p 其中 p是指针变量的说明 它说明了一个指向字符型数据的指针变量前 星号表示指针变量p是指向一个字符型指针变量的指针变量 指针变量的嵌套定义 注 访问内容时 需要二次间址操作 用 p表示 p是间接指向对象的地址 而 p是p间接指向的对象的值 例 includemain inti a 5 num 5 p printf inputinteger5 n for i 0 i 5 I num i 输入 integer5 输出 指针与函数一 指针变量作为函数参数1 指针变量作为函数形参可改变对应实参的值 传地址 如 main inta 5 i 3 out out changer 注 除数组名外 任何以地址传递的实参变量必须在变量名前加上 符号 表示传地址 在被调用函数中形参要说明为指针 2 通过指针参数可以从被调用参数中返回多个值例 求10个整数中奇数和偶数的个数voidcount intx intp1 intp2 if x 2 0 p1 else p2 main inti j sum1 0 sum2 0 for i 0 i 10 i scanf d 2 指针作形参 对应实参的形式voidsort int v intn v 和 v都是数组指针变量 调用函数 inta 10 p p 2 形参说明为指向数组元素的指针 实参为数组元素的地址或指向元素的指针变量 如 voidf int p intsize 调用函数 inta 2 3 f a 0 2 3 或 a 0 0 3 形参说明为指向下一级数组的指针 实参为下一组数组的指针 或指向下一级数组的指针变量 如 voidf int pa 3 intsize 调用函数 inta 2 3 f a 2 或 inta 2 3 p 3 p a f p 2 C语言中 函数不能返回数组 函数 结构 联合类型的值 但可以用返回指向此类数据的指针的方法实现 二 指向函数的指针变量 函数指针 定义形式 类型标识符 指针变量名 例 int p 与数组指针定义类似 char p 说明 1 p是指向一个函数的指针变量 指向该函数名代表的入口地址送指针p 此函数返回int类型的值2 用函数指针变量调用函数时 用函数名送入p中即可 作用 利用函数指针将函数名传给一个函数 例 求a b中的最小数的程序 1 一般函数调用main inta b c scanf d d 2 用函数指针调用main inta b c int p scanf d d 注 函数指针作为函数 函数名作为形参 实现将函数名作为参数传给其他函数的目的 例 有函数max min mean分别起两个整数中最大 最小 平均值 max intx inty intz if x y z x elsez y return z min intx inty intz if x y z x elsez y return z mean intx inty 转右边 intz z x y 2 return z main inta b c e d scanf d d 通过函数指针将函数名作为参数传给其他函数 便能创造出功能很强的高级函数系统 在大型c程序设计中很有作用定义另一个函数all如下 voidall intx inty func int func 函数名传递 intz z func x y printf d n z main inta b scanf d d 三 指针函数 与指针数组类似 返回指针的函数定义形式 类型标识符 函数名 参数表 例 int f x y 与指针数组类似 int f 10 返回值是一个指向整型数据的指针 可返回数组的首址 结构首址 联合首址 指针变量的地址和变量地址 例 将两个字符串连成一个串 并输出 char cat char p1 char p2 staticchara 160 p p a while p1 0 p p1 while p2 0 p p2 p p2 return a main chars1 80 s2 80 scanf s s1 scanf s s2 prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论