




已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章指针 引言C程序设计中使用指针的好处使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值 本章主要内容 地址和指针的概念对指针变量的操作和运算指针变量作为函数参数和函数返回值数组与指针指向函数的指针 10 1指针变量的概念与使用10 1 1变量与地址 程序中 inti floatk 内存中每个字节有一个编号 地址 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据存储空间的抽象 10 1 2地址与指针变量指针变量的值 其他变量的地址 变量i的地址 指针i pointer的值 i的值 10 1 3指针变量的定义一般形式 存储类型 基类型 指针变量名 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 表示定义指针变量不是 运算符 例int p1 p2 float q staticchar name 注意 1 int p1 p2 与int p1 p2 2 指针变量名是p1 p2 不是 p1 p23 指针变量只能指向定义时所规定类型的变量4 指针变量定义后 变量值不确定 应用前必须先赋值 10 1 4指针变量的赋值取地址运算符 指针变量的初始化一般形式 存储类型 数据类型 指针名 初始地址值 例inti int p 变量必须已说明过类型应一致 例inti int p 用已初始化指针变量作初值 例main inti staticint p 不能用auto变量的地址去初始化static型指针 例main inti 10 int p p i printf d p 危险 例main inti 10 k int p p 指针变量必须先赋值 再使用 10 1 5对指针变量的操作直接访问 按变量地址存取变量值间接访问 通过存放变量地址的变量去访问变量 例i 3 直接访问 3 例 i pointer 20 间接访问 20 例1 inti k i pointer 间接访问 10 指针变量与其所指向的变量之间的一些等价关系例 inti i pointer 例2 inti 100 x p q x i p 指针变量定义时指定的基类型 应该与指针变量使用时指向的变量类型相同 main floatx 2 0 y int p p 修改为float p 练习1 请选出正确的程序段 A int p B int s k scanf d p s 100 C int s k D int s k char p c char p e s 例3 通过指针变量访问整型变量 Main inta b int pointer 1 pointer 2 a 100 b 10 pointer 1 运行结果 100 10100 10 定义两个指针变量 代表两个指针变量分别指向的两个变量 零指针与空类型指针零指针 空指针 定义 指针变量值为零表示 int p 0 p指向地址为0的单元 系统保证该单元不作它用表示指针变量值没有意义 defineNULL0int p NULL p NULL与未对p赋值不同用途 避免指针变量的非法引用在程序中常作为状态比较 例int p while p NULL 例4输入两个数 并使其从大到小输出 main int p1 p2 p a b scanf d d 运行结果 a 5 b 9max 9 min 5 5 2006 9 2008 2006 2008 2006 10 1 7指针变量作为函数参数 地址传递特点 共享内存 双向 传递 swap intx inty inttemp temp x x y y temp main inta b scanf d d 例5将数从大到小输出 5 运行结果 5 9 值传递 9 5 swap int p1 int p2 intp p p1 p1 p2 p2 p main inta b scanf d d 5 9 5 例6将数从大到小输出 地址传递 运行结果 9 5 地址传递也是值传递 只是值是地址 swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 编译警告 结果不对 intx int p 例7将数从大到小输出 5 9 2000 2002 COPY 假设2000 指针变量在使用前必须赋值 main int p1 p2 p a b scanf d d voidmain voidswap int p1 int p2 int p1 p2 a b scanf d d 比较 10 1 6指针的算术运算 指针算术运算的结果依赖于指针的基类型p i指向地址p i d i为整型数 d为p指向的变量所占字节数 p p p i p i p i p i等若p1与p2指向同一数组 p1 p2 两指针间元素个数 p1 p2 dp1 p2无意义 例p指向float数 则p 1 p 1 4例p指向int型数组 且p 指针变量的关系运算若p1和p2指向同一数组 则p1p2表示p1指的元素在后p1 p2表示p1与p2指向同一元素若p1与p2不指向同一数组 比较无意义p NULL或p NULL 10 2指针与数组指向数组元素的指针变量 例intarray 10 int p p 数组名是表示数组首地址的地址常量 数组元素表示方法 变址运算符a i a i a i p i p i a i 例8数组元素的引用方法 main inta 5 pa i for i 0 i 5 i a i i 1 pa a for i 0 i 5 i printf pa d d n i pa i for i 0 i 5 i printf a d d n i a i for i 0 i 5 i printf pa d d n i pa i for i 0 i 5 i printf a d d n i a i 1 inta 1 2 3 4 5 6 7 8 9 10 p a i 数组元素地址的正确表示 A a 1 B a C p D p i 数组名是地址常量p p a a a 1 a 2 2 若有定义 int p 则下列各选项中 不同于 p p 1 的是 A p B p C p 1 D p 练习2 例voidmain inta 5 8 7 6 2 7 3 inty p 输出 56 例9注意指针变量的运算 6 main inti p a 7 p a for i 0 i 7 i scanf d p printf n for i 0 i 7 i p printf d p 例10注意指针的当前值 p a 指针变量可以指到数组后的内存单元 数组名作函数参数数组名代表数组首元素的地址 用数组名作函数实参时 是地址传递只是将实参数组首元素的地址传递给形参 这样 实参数组和形参数组就共占同一段内存单元 一维数组名作函数参数 实参与形参的合法定义和使用形式 voidinv intx intn intt i j m n 1 2 for i 0 i m i j n 1 i t x i x i x j x j t main inti a 10 3 7 9 11 0 6 7 5 4 2 inv a 10 printf Therevertedarray n for i 0 i 10 i printf d a i printf n 例11将数组a中的n个整数按相反顺序存放 实参与形参均用数组 m 4 用array 这样的形式表示array是一维数组名 中方括号内的数值并无实际作用 voidselect sort intarray 10 intn 指定元素个数与实参数组相同voidselect sort intarray intn 不指定元素个数voidselect sort intarray 5 intn 指定元素个数与实参数组不同 注意 例12将数组a中的n个整数按相反顺序存放 voidinv int x intn intt p i j m n 1 2 i x j x n 1 p x m for i p i j t i i j j t main inti a 10 3 7 9 11 0 6 7 5 4 2 inv a 10 printf Therevertedarray n for i 0 i 10 i printf d a i printf n 实参用数组 形参用指针变量 例13将数组a中的n个整数按相反顺序存放 voidinv int x intn intt i j p m n 1 2 i x j x n 1 p x m for i p i j t i i j j t main inti a 10 p a for i 0 i 10 i p scanf d p p a inv p 10 printf Therevertedarray n for p a p a 10 p printf d p 实参与形参均用指针变量 例14将数组a中的n个整数按相反顺序存放 voidinv intx intn intt i j m n 1 2 for i 0 i m i j n 1 i t x i x i x j x j t main inti a 10 p a for i 0 i 10 i p scanf d p p a inv p 10 printf Thearrayhasbeenreverted n for p arr p arr 10 p printf d p 实参用指针变量 形参用数组 10 4字符串与指针 1 用字符数组存放一个字符串例15main charstring IloveChina printf s n string 2 用字符指针指向一个字符串main char string IloveChina printf s n string 例16 includevoidmain chars1 abcde s2 5 m n p q 0 char ps s1 printf s s n s1 s2 printf s n ps printf c c c c n s2 1 s2 2 s1 3 s1 4 printf c c c c n ps ps 2 ps 4 ps 2 S1 S2 ps abcdeormnpq abcde npde acec includemain chara IamaBoy B 20 p1 p2 inti p1 a p2 B for p1 0 p1 p2 p2 p1 p2 0 printf stringais s n a printf stringBis for i 0 B i 0 i printf c B i printf n 例17 将字符串a复制为字符串b 10 4 2字符串指针作函数参数 例18 includevoidcopy string charfrom charto inti 0 while from i 0 to i from i i to i 0 main chara Iamateacher charb youareastudent printf stringa s nstringb s n a b copy string a b printf stringa s nstringb s n a b 练习3 1 voidswap char x char y chart t x x y y t main chars1 abc s2 123 swap s1 s2 printf s s n s1 s2 程序执行后的输出结果是A 123 abcB abc 123C 1bc a23D 321 cba2 若有以下调用语句 则不正确的fun函数的首部是 A voidfun intm intx B voidfun ints inth 41 C voidfun intp int s D voidfun intn inta main inta 50 n fun n 一级指针变量与一维数组的关系int p与intq 10 数组名是指针 地址 常量p q p i是q i 的地址数组元素的表示方法 下标法和指针法 即若p q 则p i q i p i q i 形参数组实质上是指针变量 即intq int q在定义指针变量 不是形参 时 不能把int p写成intp 系统只给p分配能保存一个指针值的内存区 一般2字节 而给q分配2 10字节的内存区 如 建立一份学生档案 对每一个学生至少需要以下一些信息 学号 unsignedno 姓名 charname 20 性别 charsex 年龄 intage 成绩 floatscore 地址 charaddr 30 C程序可将上述数据的集合定义为一种结构体类型 structstudent unsignednum charname 20 charsex intage floatscore charaddr 30 一 结构体定义的一般形式 结构的定义和初始化 struct结构体名 成员表列 成员表列的写法 类型标识符成员名 例structstudent intnum charname 20 charsex intage floatscore charaddr 30 结构体类型定义描述结构的组织形式 不分配内存 结构体类型定义的作用域 注意 1 这只是定义一种类型的方法 尚未定义变量 2 struct 关键词 保留字 表示定义一种结构体类型 1 先定义结构体类型再定义结构体变量 有三种方法可用来定义结构体变量 例 structstudent intnum charname 20 charsex intage floatscore charaddr 30 二 结构变量的定义 structstudentx1 x2 类型标识符 例 structstudent intnum charname 20 charsex intage charaddr 30 x1 x2 成员表列 变量名表列 2 在定义结构体类型的同时定义变量 定义形式struct结构体名 定义形式struct 成员表列 变量名表列 不出现结构体类型名 3 直接定义结构类型变量 如 struct intnum charname 20 charsex intage charaddr 30 x1 x2 1 类型名与变量名是不同的概念 2 允许成员名又为另一个已定义的结构型变量 3 每一个成员的作用如同该类型的变量 4 成员名与程序中的变量名可相同但意义不同 几点说明 类型 不分配内存 变量 分配内存类型 不能赋值 存取 运算 变量 可以 structdate intmonth intday intyear structstudent intnum charname 20 charsex intage structdatebirthday charaddr 30 x1 x2 例 结构体的嵌套定义 结构的初始化 structstudentx1 8906 LiMing M 85 5 一 先定义结构 在定义结构变量时对每个成员赋初值 如 structstudent unsignedNo charname 20 charsex floatscore 二 结构定义与变量定义及初始化合二为一 structexp inta floatb charyn 8 x 1234 56 7 test 但不能这样写 structexp inta 1234 floatb 56 7 charyn 8 test x 11 1 3访问结构成员 如 x1为structstudent型变量 则x1 No 表示x1的学号x1 name 表示x1的名字 访问结构变量实质上是引用其成员 一 圆点运算符 有两种运算符可访问结构成员 注意 1 只能用变量的成员 不可用结构变量名直接运算 2 每一个成员的作用与其同类型的简单变量的引用相同 二 箭头运算符 例 structstudent charname 10 charsex intage floatscore charaddr 20 x1 structstudent p 则p为结构指针变量 它可用来存放student型变量的地址 令p 则p为x1的首地址 访问结构成员 p name表示x1的姓名 p age表示x1的年龄 p name等价于 p name p age等价于 p age 2 用指针变量 p 成员名 p num 3 用指向运算符 成员名p num 1 结构体变量名 成员名x1 num 注意 指针变量p必须是结构指针型 且有p 第十六周上机题 3 4 1 P101第5题2 以下程序把一个十进制数转换成二进制数 并把此二进制数和每一位放在一维数组b中 然后输出b数组 注意 二进制数的最低位放在数组的第一个元素中 用指针来实现 第十七周 3 4 1 请编一个函数fun int a intn int odd int even 函数的功能是分别求出数组中所有奇数之和以及所有偶数之和 形参n给了数组中数据的个数 利用指针odd返回奇数之和 利用指针even返回偶数之和 2 教材p1683 1 2 第十七周 1 2 1 实验教材p733 5 2 教材p1683 1 2 教材p1683 1 include includevoidmain intk 0 chara 80 b 80 c 80 0 p q p a q b gets a gets b while if c k p elsec k q p k if p 0 strcat c p elsestrcat c q puts c p 0 q 0 p q q 教材p1683 2 includevoidmain inta 11 x i printf input10integers n for i 1 i scanf d printf inputx scanf d i a i i 0 i 11 教材P101第5题 includedoubleFib intn doublea if n 0 a 0 else if n 1 a 1 elsea Fib n 1 Fib n 2 returna main intn printf 请输入n的值 scanf d 给出年月日 计算该日是该年的第几天 要求写出intsum day intmonth intday 计算日期函数intleap intyear 判断闰年函数 intleap intyear inta if year 400 0 year 100 0 intsum day intmonth intday intdays switch month case1 days day break case2 days 31 day break case3 days 31 28 day break case4 days 31 2 28 day break case5 days 31 2 30 28 day break case6 days 31 3 30 28 day break case7 days 31 3 30 2 28 day break case8 days 31 4 30 2 28 day break case9 days 31 5 30 2 28 day break case10 days 31 5 30 3 28 day break case11 days 31 6 30 3 28 day break case12 days 31 6 30 4 28 day break returndays main intmonth day year printf 输入年 月 日 scanf d d d 实验教材P 73 3 5 includedoublef doublex intn inti doublef 1 t 1 for i 1 i 2 n i i 2 t t x x i 1 i f f t returnf main intn doublex printf Inputx n scanf lf d 实验教材p7116题 includeintfactorsum intn intindex sum sum 1 1是因子 for index 2 index n 2 index
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- v架空线路工程施工组织设计方案
- 湿敏器件创新创业项目商业计划书
- 《施工组织设计专项施工方案资料》某市人民医院传染病房工程安全文明施工方案
- 渔业品牌塑造与市场营销创新创业项目商业计划书
- 农作物智能温控大棚种植技术创新创业项目商业计划书
- 工业互联网项目-汇报-1226
- 2025年教师招聘之《幼儿教师招聘》检测卷附参考答案详解(达标题)
- 2025内蒙古呼伦贝尔林业集团有限公司招聘工作人员5人笔试备考及完整答案详解1套
- 教师招聘之《幼儿教师招聘》练习题含答案详解(夺分金卷)
- 教师招聘之《小学教师招聘》过关检测试卷附答案详解【模拟题】
- 颌面外科清创缝合
- 人教版数学二年级上册第一单元 分类与整 理 综合素养测评A卷(含答案)
- 2025年北京市公务员考试行测真题及答案详解参考
- GB/T 16432-2025康复辅助器具分类和术语
- 儿童保健三基培训课件
- 保险法考试题型及答案
- 小儿散瞳健康宣教
- b级英语考试题型及答案
- 开业活动湘菜活动方案
- 环保设备介绍
- 配电柜接线外包合同
评论
0/150
提交评论