C程序设计ch10指针.ppt

上传人:max****ui 文档编号:6331388 上传时间:2020-02-23 格式:PPT 页数:86 大小:1.35MB
返回 下载 相关 举报
C程序设计ch10指针.ppt_第1页
第1页 / 共86页
C程序设计ch10指针.ppt_第2页
第2页 / 共86页
C程序设计ch10指针.ppt_第3页
第3页 / 共86页
点击查看更多>>
资源描述
第十章指针 C程序设计中使用指针可以 使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值 10 1指针与指针变量变量与地址 程序中 inti floatk 内存中每个字节有一个编号 地址 内存 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据存储空间的抽象 指针与指针变量指针 变量的地址指针变量 专门存放变量地址的变量叫指针变量 2000 指针 指针变量 变量的内容 变量的地址 取变量的地址单目运算符优先级 2结合性 自右向左 printf x n i pointer 指针变量的定义和使用 int i pointer 与 的关系 互为逆运算i pointer 指针变量 它的内容是地址量 i pointer 指针的目标变量 它的内容是数据 i pointer 指针变量占用内存的地址 含义 取指针所指向变量的内容单目运算符优先级 2结合性 自右向左 指针变量定义的一般形式 数据类型 标识符 表示定义指针变量不是 运算符 例int p1 p2 float q staticchar name 指针变量名是p1 p2 不是 p1 p2指针变量只能指向定义时所规定类型的变量指针变量定义后 变量值不确定 应用前必须先赋值 例main inti 10 int p p i printf d p 危险或运行出错 例main inti 10 k int p p 指针变量必须先赋值 再使用 例inti int p 用已初始化指针变量作初值 初始值设为零指针int p 0 即 p指向地址为0的单元 系统保证该单元不作它用表示指针变量值没有意义 defineNULL0int p NULL p NULL与未对p赋值不同用途 避免指针变量的非法引用在程序中常作为状态比较 例int p while p NULL 例指针的概念 include stdio h main inta int pa 运行结果 a 10 pa 10 a f86 hex pa f86 hex pa f8a hex 例输入两个数 并使其从大到小输出 include stdio h main int p1 p2 p a b scanf d d 运行结果 a 5 b 9max 9 min 5 5 200C 9 2010 200C 2010 200C 指针变量作为函数参数回顾 值传递 include stdio h swap intx inty inttemp temp x x y y temp main inta b scanf d d 例将数从大到小输出 5 9 5 5 9 COPY include stdio h swap intx inty inttemp temp x x y y temp main inta b scanf d d 值传递 5 9 运行结果 5 9 指针变量作为函数参数回顾 值传递 例将数从大到小输出 include stdio h swap int p1 int p2 intp p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2004 5 9 COPY 5 现改用指针作参数 地址传递p352 include stdio h swap int p1 int p2 intp p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2004 5 9 当函数调用结束 运行结果 9 5 这第一种方法 正确 include stdio h swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 运行结果 9 5 运行出错 intx int p 例将数从大到小输出 5 9 2000 2004 5 9 COPY include stdlib h int p int malloc sizeof int free p int p newint deletep 第二种方法 改错后算法有效 观察malloc 的返回值void 称之为空类型指针使用时要进行强制类型转换 int p int malloc sizeof int 又例char p1 void p2 p1 char p2 p2 void p1 表示不指定p是指向哪一种类型数据的指针变量 include stdio h swap intx inty intt t x x y y t main inta b int pointer 1 pointer 2 scanf d d 运行结果 5 9 例将数从大到小输出 值传递 5 9 2000 2004 COPY 5 5 9 第三种方法 不正确 值传递 运行结果 5 9 例将数从大到小输出 include stdio h swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2004 COPY 2000 2000 2004 第四种方法 不正确 值传递 10 2指针与数组p345指向数组元素的指针变量 例intarray 10 int p p 数组名本身就是表示数组首地址的地址常量 p 将数组元素地址 p 数组元素表示方法 变址运算符a i a i a i p i p i a i 例数组元素的引用方法 include stdio h 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 指针的算术运算 例inta 10 int p1 p1 p2无意义 指针的自增自减运算 例inta 10 int p 例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 include stdio h main inti p a 7 p a for i 0 i 7 i scanf d p printf n p a for i 0 i 7 i p printf d p 例注意指针的当前值 指针变量可以指到数组后的内存单元 指针变量的关系运算若p1和p2指向同一数组 则p1p2表示p1指的元素在后p1 p2表示p1与p2指向同一元素若p1与p2不指向同一数组 比较无意义p NULL或p NULL 数组名作函数参数数组名作函数参数显然是传递数组首地址数组名作函数参数 实参与形参的对应关系 例将数组a中的n个整数按相反顺序存放 include stdio h 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 Thearrayhasbeenreverted n for i 0 i 10 i printf d a i printf n m 4 实参与形参均用数组 例将数组a中的n个整数按相反顺序存放 include stdio h 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 Thearrayhasbeenreverted n for i 0 i 10 i printf d a i printf n 实参用数组 形参用指针变量 例将数组a中的n个整数按相反顺序存放 include stdio h 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 Thearrayhasbeenreverted n for p a p a 10 p printf d p 实参与形参均用指针变量 例将数组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 实参用指针变量 形参用数组 一级指针变量与一维数组的关系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字节的内存区 动态分配一个数的内存 int p newint deletep FreeMemory或int p int malloc sizeof int free p FreeMemory效果如右图 指针变量p f8c f8c f88 动态分配一个数组内存intn 4 int p newint n delete p FreeMemory或int p int malloc sizeof int n free p FreeMemory 内存动态分配 include definen10intmain intcave n for intj 0 j n j cave j 0 intpt 0 intvl 1 i end 0 for end cave pt 1 intvl pt pt intvl intvl intvl n pt pt n end pt 0 例狼追兔子问题 指针与二维数组二维数组的地址 对于一维数组 1 数组名array表示数组的首地址 即array 0 的地址 2 数组名array是地址常量 3 array i是元素array i 的地址 4 array i array i 对于二维数组 1 a是数组名 包含三个元素a 0 a 1 a 2 2 每个元素a i 又是一个一维数组 包含4个元素 inta 3 4 基类型 行指针与列指针 对二维数组inta 3 4 有a 二维数组的首地址 即第0行的首地址a i 第i行的首地址a i a i 第i行第0列的元素地址a i j a i j 第i行第j列的元素地址 a i j a i j a i j a i a i a i a i a i 0 值相等 含义不同a i a i 表示第i行首地址 指向行a i a i a i 0 表示第i行第0列元素地址 指向列 二维数组元素表示形式 1 a 1 2 2 a 1 2 3 a 1 2 4 a 0 0 1 4 2 地址表示 1 a 1 2 a 1 0 3 a 1 4 a 1 5 int a 1 地址表示 1 a 1 2 2 a 1 2 3 a 1 2 4 a 0 0 1 4 2 二维数组的指针变量指向二维数组元素的指针变量 例指向二维数组元素的指针变量 main staticinta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 int p for p a 0 p a 0 12 p if p a 0 4 0 printf n printf 4d p p a p 指向一维数组的指针变量定义形式 数据类型 指针名 一维数组维数 例int p 4 不能少int p 4 与int p 4 不同 p的值是一维数组的首地址 p是行指针 可让p指向二维数组某一行如inta 3 4 p 4 a 一维数组指针变量维数和二维数组列数必须相同 例一维数组指针变量举例 include stdio h main staticinta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 inti j p 4 for p a i 0 i 3 i p for j 0 j 4 j printf d p j printf n p a 0 p a p p i j 例二维数组与指针运算 include stdio h defineC2 outputcol 3main inta 3 4 1 2 3 4 3 4 5 6 5 6 7 8 inti int p 4 a for i 0 i 3 i printf d n p i C 运行结果 357 二维数组的指针作函数参数用指向变量的指针变量用指向一维数组的指针变量用二维数组名 参见p362案例1 类似 例3个学生各学4门课 计算总平均分 并输出第n个学生成绩 include stdio h defineCOL4main voidaverage float int voidsearch float COL int floatscore 3 COL 65 67 79 60 80 87 90 81 90 99 100 98 average score 3 COL search score 2 voidaverage float p1 intn float p end sum 0 aver p end p1 n 1 for p1 p end p1 sum sum p1 aver sum n printf average 5 2f n aver voidsearch float p COL intn inti printf No d n n for i 0 i COL i printf 5 2f p n i putchar n 列指针 行指针 例3个学生各学4门课 计算总平均分 并查找一门以上课不及格学生 输出其各门课成绩 include stdio h defineCOL4voidsearch float p COL intn inti j flag for i 0 i n i flag 0 for j 0 j COL j if p i j 60 flag 1 if flag 1 printf No disfail hisscoresare n i 1 for j 0 j COL j printf 5 1f p i j printf n main inti j voidsearch float COL int floatscore 3 4 60 70 76 77 70 56 73 89 90 76 59 90 search score 3 二维数组与一维数组指针变量的关系如inta 5 10 与int p 10 二维数组名是一个指向有10个元素的一维数组的指针常量p a i使p指向二维数组的第i行 p i j a i j 二维数组形参实际上是一维数组指针变量 即intx 10 int x 10 变量定义 不是形参 时两者不等价系统只给p分配能保存一个指针值的内存区 一般2字节 而给a分配2 5 10字节的内存区 10 3指针与字符串字符串表示形式用字符数组实现 例main charstring IloveChina printf s n string printf s n string 7 用字符指针实现 例main char string IloveChina printf s n string string 7 while string putchar string 0 string 字符指针初始化 把字符串首地址赋给string char string string IloveChina string 0 字符串指针作函数参数 例用函数调用实现字符串复制 1 用字符数组作参数 2 用字符指针变量作参数 include stdio h voidcopy string charfrom charto inti 0 while from i 0 to i from i i to i 0 main chara Iamateacher charb Youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b include stdio h voidcopy string char from char to for from 0 from to to from to 0 main char a Iamateacher char b Youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b 字符指针变量与字符数组char cp 与charstr 20 str由若干元素组成 每个元素放一个字符 而cp中存放字符串首地址charstr 20 str IloveChina char cp cp IloveChina str是地址常量 cp是地址变量cp接受键入字符串时 必须先开辟存储空间 例charstr 10 scanf s str 而char cp scanf s cp 改为 char cp str 10 cp str scanf s cp 字符串与数组关系字符串为一维字符数组 其特点 数组名是指向数组首地址的地址常量数组元素的引用方法可用指针法和下标法数组名作函数参数是地址传递等区别存储格式 字符串结束标志赋值方式与初始化输入输出方式 s c charstr Hello charstr Hello charstr H e l l o char cp Hello inta 1 2 3 4 5 int p 1 2 3 4 5 charstr 10 cp inta 10 p str Hello cp Hello a 1 2 3 4 5 p 1 2 3 4 5 scanf s str printf s str gets str puts str 10 4返回指针值的函数p355函数定义形式 类型标识符 函数名 参数表 例int f intx inty 例指针函数实现 有若干学生成绩 要求输入学生序号后 能输出其全部成绩 include stdio h defineCOL4main floatscore COL 60 70 80 90 56 89 67 88 34 78 90 66 float search float COL intn inti m p printf Enterthenumberofstudent scanf d 例写一个函数 求两个int型变量中居于较大值的变量的地址 int f1 int x int y if x y returnx elsereturny include stdio h main inta 2 b 3 int p p f1 2 3 2004 2000 当调用函数f1 结束时 释放局部变量存储空间 2004 int f1 int x int y if x y returnx elsereturny include stdio h main inta 2 b 3 int p p f1 这第一种方法 正确 例写一个函数 求两个int型变量中居于较大值的变量的地址 int f3 intx inty if x y return include stdio h main inta 2 b 3 int p p f3 a b printf d n p 2 3 3 2 不能把函数退出时被销毁的形参或局部变量及其地址作函数返回值 2014 这第二种方法 不正确 当调用函数f3 结束时 释放局部变量存储空间 10 5函数指针p355函数指针 函数在编译时被分配的入口地址 用函数名表示 函数指针变量赋值 如p max 函数返回值的数据类型 专门存放函数入口地址可指向返回值类型相同的不同函数 指向函数的指针变量定义形式 数据类型 指针变量名 如int p 函数指针变量指向的函数必须有函数说明 函数调用形式 c max a b c p a b c p a b 对函数指针变量p n p p 无意义 不能省int p 与int p 不同 例用函数指针变量调用函数 比较两个数大小 main 以前解法 intmax int int inta b c scanf d d include stdio h main intmax int int p inta b c p max scanf d d 用函数指针变量作函数参数 例用函数指针变量作参数 求最大值 最小值和两数之和 10 6结构体和指针p358指向结构体变量的指针定义形式 struct结构体名 结构体指针名 例structstudent p 使用结构体指针变量引用成员 存放结构体变量在内存的起始地址 指向运算符优先级 1结合方向 从左向右 例指向结构体的指针变量 include stdio h main structstudent longintnum charname 20 charsex floatscore stu 1 p p 例intn int p n 10 structstudentstu1 structstudent p p num 101 指向结构体数组的指针 例指向结构体数组的指针 include stdio h structstudent intnum charname 20 charsex intage stu 3 10101 LiLin M 18 10102 ZhangFun M 19 10104 WangMin F 20 main structstudent p for p stu pnum p name p sex p age 例时间结构体指针 include time h time tt time NULL or time tt time Othermembersare tm year 当前年份 1900tm monin 0 11 tm mdayin 1 31 tm wdayin 0 6 tm ydayin 0 365 is这一天在本年中是第几天 用指向结构体的指针作函数参数用结构体变量的成员作参数 值传递 效率低用指向结构体变量或数组的指针作参数 地址传递 include stdio h structdata inta b c main voidfunc structdata parm structdataarg arg a 27 arg b 3 arg c arg a arg b printf arg a darg b darg c d n arg a arg b arg c printf CallFunc n func 例用结构体指针变量作函数参数 例p365InventoryUpdating Thepriceandquantityofitemsstockedinastorechangeseveryday TheymayeitherincreaseorDecrease Theprogramreadstheincrementalvaluesofpriceandquantityandcomputesthetotalvalueoftheitemsinstock Theprogramillustratestheuseofstructurepointersasfunctionparameters Item theaddressofthestructureitem ispassedtothefunctionsupdate andmul Theformalargumentsproductandstock whichreceivethevalueof item aredeclaredaspointersoftypestructstores includestructstores charname 20 floatprice intquantity voidmain voidupdate structstores float int floatmul structstores stock floatp increment value intq increment structstoresitem XYZ 25 75 12 structstores ptr update 10 7指针数组和多级指针用于处理二维数组或多个字符串指针数组定义 数组中的元素为指针变量定义形式 存储类型 数据类型 数组名 数组长度说明 例int p 4 指针所指向变量的数据类型 指针本身的存储类型 区分int p 4 与int p 4 指针数组赋值与初始化 指针数组赋值与初始化 charname 5 9 gain much stronger point bye char name 5 gain much stronger point bye 二维数组与指针数组区别 二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元 数组维数 2 各字符串长度 指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量 include stdio h main intb 2 3 pb 2 inti j for i 0 i 2 i for j 0 j 3 j b i j i 1 j 1 pb 0 b 0 pb 1 b 1 for i 0 i 2 i for j 0 j 3 j pb i printf b d d 2d n i j pb i 例用指针数组处理二维数组 例对字符串排序 简单选择排序 i 0 例对字符串排序 简单选择排序 name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 1 例对字符串排序 简单选择排序 name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 2 例对字符串排序 简单选择排序 name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC i 3 例对字符串排序 简单选择排序 include stdio h include string h main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n for inti 0 i0 k j if k i temp name i name i name k name k temp name 0 name 1 name 2 name 3 name 4 name GreatWall FORTRAN Computer Followme BASIC 多级指针定义 指向指针的指针一级指针 指针变量中存放目标变量的地址 例int p1 int p2 inti 3 p2 二级指针 指针变量中存放一级指针变量的地址 例int p inti 3 p 一级指针 单级间接寻址 二级指针 一级指针 目标变量 二级间接寻址 定义形式 存储类型 数据类型 指针名 如char p 例inti p p p是二级指针 不能用变量地址为其赋值 指针本身的存储类型 最终目标变量的数据类型 p是p间接指向对象的地址 p是p间接指向对象的值 例inti 3 int p1 int p2 p1 三级以上指针 学有余力者自学 例用二级指针处理字符串 defineNULL0 include stdio h voidmain char p char name hello good world bye p name 1 printf o s p p p 2 while p NULL printf s n p 运行结果 644 goodbye 用 p可输出地址 o或 x 也可用它输出字符串 s p 二级指针与指针数组的关系int p与int q 10 指针数组名是二级指针常量p q p i是q i 的地址指针数组作形参 int q 与int q完全等价 但作为变量定义两者不同系统只给p分配能保存一个指针值的内存区 而给q分配10块内存区 每块可保存一个指针值 动态分配二维数组 ANSIC intm 3 n 4 int array array int malloc sizeof int m for i 0 i m i array i int malloc sizeof int n FreeMemoryfor i 0 i m i free array i free array C intm 3 n 4 int array array newint m for i 0 i n i array i newint n FreeMemoryfor i 0 i n i delete array i delete array 例打印任意奇数阶的魔方阵 命令行参数命令行 在操作系统状态下 为执行某个程序而键入的一行字符命令行一般形式 命令名参数1参数2 参数n main intargc char argv 命令行参数传递 带参数的main函数形式 D 07001 copy exe source ctemp c 有3个字符串参数的命令行 命令行中参数个数 元素指向命令行参数中各字符串首地址 形参名任意 第一个参数 main所在的可执行文件名 例输出命令行参数 include stdio h main intargc char argv while argc 1 argv printf s n argv argc main intargc char argv while argc 0 printf s n argv 1 编译 链接test c 生成可执行文件test exe2 在DOS状态下运行 test exe所在路径下 例如 D 07001 test exe helloworld 运行结果 helloworld 运行结果 testhelloworld 例下列定义的含义 1 int p 3 2 int p 3 3 int p int 4 int p int 5 int p int 6 int p 3 int 7 int p 3 int
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!