C语言程序设计教案.ppt

上传人:xin****828 文档编号:6379204 上传时间:2020-02-24 格式:PPT 页数:83 大小:834KB
返回 下载 相关 举报
C语言程序设计教案.ppt_第1页
第1页 / 共83页
C语言程序设计教案.ppt_第2页
第2页 / 共83页
C语言程序设计教案.ppt_第3页
第3页 / 共83页
点击查看更多>>
资源描述
第八章指针 C程序设计中使用指针可以 使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值 8 1指针的概念变量与地址 程序中 inti floatk 内存中每个字节有一个编号 地址 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据存储空间的抽象 指针与指针变量指针 一个变量的地址指针变量 专门存放变量地址的变量叫 2000 指针 指针变量 变量的内容 变量的地址 与 运算符含义 含义 取变量的地址单目运算符优先级 2结合性 自右向左 含义 取指针所指向变量的内容单目运算符优先级 2结合性 自右向左 两者关系 互为逆运算理解 i pointer 指针变量 它的内容是地址量 i pointer 指针的目标变量 它的内容是数据 i pointer 指针变量占用内存的地址 i pointer i i pointer i i pointer i i pointer i i pointer i i pointer i 直接访问与间接访问直接访问 按变量地址存取变量值间接访问 通过存放变量地址的变量去访问变量 例i 3 直接访问 3 例 i pointer 20 间接访问 20 例k i 直接访问k i pointer 间接访问 10 例k i k i pointer 8 2指针变量指针变量与其所指向的变量之间的关系 指针变量的定义一般形式 存储类型 数据类型 指针名 合法标识符 指针变量本身的存储类型 指针的目标变量的数据类型 表示定义指针变量不是 运算符 例int p1 p2 float q staticchar name 注意 1 int p1 p2 与int p1 p2 2 指针变量名是p1 p2 不是 p1 p23 指针变量只能指向定义时所规定类型的变量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 指针变量必须先赋值 再使用 零指针与空类型指针零指针 空指针 定义 指针变量值为零表示 int p 0 p指向地址为0的单元 系统保证该单元不作它用表示指针变量值没有意义 defineNULL0int p NULL p NULL与未对p赋值不同用途 避免指针变量的非法引用在程序中常作为状态比较 例int p while p NULL void 类型指针表示 void p 使用时要进行强制类型转换 例char p1 void p2 p1 char p2 p2 void p1 表示不指定p是指向哪一种类型数据的指针变量 例指针的概念 main inta int pa 运行结果 a 10 pa 10 a f86 hex pa f86 hex pa f88 hex 例输入两个数 并使其从大到小输出 main int p1 p2 p a b scanf d d 运行结果 a 5 b 9max 9 min 5 5 2006 9 2008 2006 2008 2006 指针变量作为函数参数 地址传递特点 共享内存 双向 传递 swap intx inty inttemp temp x x y y temp main inta b scanf d d 例将数从大到小输出 5 9 5 5 9 COPY 指针变量作为函数参数 地址传递特点 共享内存 双向 传递 swap intx inty inttemp temp x x y y temp main inta b scanf d d 例将数从大到小输出 值传递 5 9 运行结果 5 9 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 2002 5 9 COPY 5 例将数从大到小输出 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 2002 5 9 例将数从大到小输出 运行结果 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 运行结果 9 9 编译警告 结果不对 intx int p 例将数从大到小输出 5 9 2000 2002 9 9 COPY 假设2000 指针变量在使用前必须赋值 ch9 32 c 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 2002 COPY 5 5 9 运行结果 5 9 例将数从大到小输出 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 2002 COPY 2000 地址传递 2000 2002 8 3指针与数组指向数组元素的指针变量 例intarray 10 int p p 数组名是表示数组首地址的地址常量 指针的运算指针变量的赋值运算p 指针变量p2值 p1 不能把一个整数 p 也不能把p的值 整型变量 如inti p p 1000 i p 指针变量与其指向的变量具有相同数据类型 指针的算术运算 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 则p 1指向a 1 例inta 10 int p 例inta 10 int p1 1 指针变量的关系运算若p1和p2指向同一数组 则p1p2表示p1指的元素在后p1 p2表示p1与p2指向同一元素若p1与p2不指向同一数组 比较无意义p NULL或p NULL 数组元素表示方法 变址运算符a i a i a i p i p i a i 例数组元素的引用方法 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 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 例voidmain inta 5 8 7 6 2 7 3 inty p 输出 56 例注意指针变量的运算 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 例注意指针的当前值 p a 指针变量可以指到数组后的内存单元 数组名作函数参数数组名作函数参数 是地址传递数组名作函数参数 实参与形参的对应关系 例将数组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 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个整数按相反顺序存放 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个整数按相反顺序存放 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字节的内存区 指针与二维数组二维数组的地址 对于一维数组 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 一维数组指针变量维数和二维数组列数必须相同 例一维数组指针变量举例 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 0 j 例二维数组与指针运算 main inta 3 4 1 2 3 4 3 4 5 6 5 6 7 8 inti int p 4 a q a 0 for i 0 i 3 i if i 0 p i i 2 q 1 elsep q for i 0 i 3 i printf d a i i printf d d n int p q 运行结果 2 4 7 5 3 2 二维数组的指针作函数参数用指向变量的指针变量用指向一维数组的指针变量用二维数组名 例3个学生各学4门课 计算总平均分 并输出第n个学生成绩 main voidaverage float p intn voidsearch float p 4 intn floatscore 3 4 65 67 79 60 80 87 90 81 90 99 100 98 average score 12 search score 2 voidaverage float p intn float p end sum 0 aver p end p n 1 for p p end p sum sum p aver sum n printf average 5 2f n aver voidsearch float p 4 intn inti printf No d n n for i 0 i 4 i printf 5 2f p n i 列指针 行指针 函数说明 floatp 4 p n i 例3个学生各学4门课 计算总平均分 并查找一门以上课不及格学生 输出其各门课成绩 p j i 二维数组与一维数组指针变量的关系如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字节的内存区 8 4指针与字符串字符串表示形式用字符数组实现 例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 用字符指针变量作参数 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 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 8 5指针与函数函数指针 函数在编译时被分配的入口地址 用函数名表示 函数指针变量赋值 如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 main intmax int int p inta b c p max scanf d d 用函数指针变量作函数参数 例用函数指针变量作参数 求最大值 最小值和两数之和 8 6返回指针值的函数函数定义形式 类型标识符 函数名 参数表 例int f intx inty 例指针函数实现 有若干学生成绩 要求输入学生序号后 能输出其全部成绩 main floatscore 4 60 70 80 90 56 89 67 88 34 78 90 66 float search float pointer 4 intn p inti m printf Enterthenumberofstudent scanf d 例写一个函数 求两个int型变量中居于较大值的变量的地址 2 3 2002 2000 例写一个函数 求两个int型变量中居于较大值的变量的地址 2002 例写一个函数 求两个int型变量中居于较大值的变量的地址 2 3 3 2 例写一个函数 求两个int型变量中居于较大值的变量的地址 不能返回形参或局部变量的地址作函数返回值 200A 8 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 各字符串长度 指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量 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 例用指针数组处理二维数组 例对字符串排序 简单选择排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 0 i0 k j if k i temp name i name i name k name k temp i 0 例对字符串排序 简单选择排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 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 i 1 例对字符串排序 简单选择排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 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 i 2 例对字符串排序 简单选择排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 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 i 3 例对字符串排序 简单选择排序 main voidsort char name intn print char name intn char name Followme BASIC GreatWall FORTRAN Computer intn 5 sort name n print name n voidsort char name intn char temp inti j k for i 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 多级指针 例三级指针int p 四级指针char p 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 2000 2002 2000 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 输出 1 2 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 输出 1 2 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 2000 2002 2000 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 2000 2002 输出 2 1 例一级指针与二级指针 includevoidswap int r int s int t t r r s s t main inta 1 b 2 p q p 输出 2 1 例用二级指针处理字符串 defineNULL0voidmain 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块内存区 每块可保存一个指针值 命令行参数命令行 在操作系统状态下 为执行某个程序而键入的一行字符命令行一般形式 命令名参数1参数2 参数n main intargc char argv 命令行参数传递 带参数的main函数形式 C TC copy exe source ctemp c 有3个字符串参数的命令行 命令行中参数个数 元素指向命令行参数中各字符串首地址 形参名任意 第一个参数 main所在的可执行文件名 例输出命令行参数 test c 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所在路径下 例如 C TC 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交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!