c语言现代程序设计第十章,C语言程序设计第十章指针.ppt

253b171540df25e1b84436cbe50dfc72.gifC语言程序设计第十章指针.ppt

第十章 指 针Pointers,功能 1、有效地表示复杂的数据结构 2、能动态分配内存 3、能方便地使用字符串 4、有效方便地使用数组 5、在函数调用时能得到多于1个地值 6、能直接处理内存地址,10.1 地址和指针的概念,变量的静态特性 在源程序中 以变量名出现 main int m2; int n 1; m n ; ,在执行指令序列 以地址身份出现 mov 2000,2002 ,变量的动态特性,结论程序执行时,变量的名字不存在 取而代之是分配给变量的单元地址. 因此有必要提供对地址的管理指针,几个概念,指针型数据该数据表示了内存中某一存储单元的地 址值,如2000,2002,2004,3010等 2. 指针类型能表示指针型数据的一种数据类型 3. 指针变量被定义为指针类型的变量,用来存放另一 存储单元的地址值。,如 i_pointer, 自身的变量的2000表示对地址值为2000的存贮单元即变量i的指向,也称其为变量 i 的指针 可简化表示为右图, 称 i_pointer为变量 i 的指针如对整型变量 i 的访问,指针变量与普通变量的区别,1、普通变量用来存储单元的内容 2、指针变量用来存储单元的地址 称变量 i_pointer 为变量 i 的指针,i 的指针与 i 的区别在于i的值是 3它是内存单元1000的内容;而 i 的指针是存放变量 i 的地址1000通过该指针可间接取得变量 i的值。改错P48,10.1.2 指针变量的说明,格式,存储类别 所指后面数据类型 *变量初值 ;,例 float *p ; /*说明p为指向实型变量的指针变量*/ int x, *px; /*说明了整型变量x和指向整型变量的指 针变量Px*/ double *pc; /*说明了指向双精度实型变量的指针变量*/,10.1.3 指针变量的使用,指针变量的运算符 取地址运算符 含义置指针p为空,即没有指向任何对象 语句if pNULL 含义判断指针P是否为空,若指针p为空,则表达式成立。,例如 int x10, y ,*px; p /*说明变量 a和指针变量pa */ pa /*将变量a的地址赋给指针pa */,int a , *pa /*说明变量 a和指针变量pa并 */ 将变量a的地址赋给指针pa */,3避免错误,int a ; *pa /*发生指针变量指向数据类型的错误*/,10.1.5 引用指针变量,当指针变量定义和赋值之后,引用变量的方式可以用变量名直接引用,也可以通过指向变星的指针间接引用。10.2 指针变量作函数参数,10.2.1 指针作函数的参数 C中指针表示地址的概念,指针作函数的参数就是指在 函数间传递变量的地址。要注意实参的数据类型要与作为 形参的指针所指的对象的数据类型一致。,指针px所指的内容加指针py所指的内容,通过指针参数使函数返回多个值,函数调用结束时返回一个 且仅一个结果,称为函数的返回值,并且参数间的值传递使函数只能作用于形参变量而无法修改实参变量的值。如例9-6 中swap函数。仅仅实现函数中x与y交换,没有实现a 与 b单元数据的交换,/*将py指向单元中的值赋给px指向的单元里*/,/*将px指向单元中的值赋给临时变量temp*/,/*将临时变量temp的值赋给px指向单元中*/,/*问题int *temp ; 这样定义可以吗*/,例103 用函数交换函数swap中两个变量的值。,1. 进入swap函数时各个 变量的状态和相互关系,2. swap函数的执行过程 和各个变量的值的变化 过程,10.2.2 函数的返回值为指针,格式返回数据类型 * 函数名形参表 return 地址 ; ,例104 使用函数求两个变量的最大值。, 3,62000,2002,2004,变量a,变量b3010,参数指针a3012,参数指针b,3014,指针变量p,10.2.3 指向函数的指针,2000i变量指针 p变量指针变量,一、概念,2.函数指针变量 用来存放函数入口地 址的变量p,1.函数的指针 函数的入口地址 1000,1100 函数名,二函数指针变量的定义,函数返回类型 *函数指针变量;,例 int *P ;有一个指针变量指向函数 即p的值因为一函数的入口 所指函数返回值为整型,试比较下面两个说明语句三、赋值,int *p; /*定义一函数指针*/ 赋值 将函数max 的入口地址给p p max ; 将函数max 的入口地址给p p add ;,四、通过函数指针调用函数10.3 数组与指针,10.3.1 通过指针引用一维数组中的元素 数组在内存中占据一段连续空间,数组名表示首地址。 例int x, y, z, a612, 15, 18, 21, 24, 27;,地址 a a1 a2 a3 a4 a5,18 24,数据元素的访问的方式 1通过下标 例 xa2;za4;,1000 1002 1004 1006 1008 100A 100C 100E 1010,2通过地址 例 y*a3;,3通过指针 例int *p,指针操作与数组元索的关系,1若p1 则*p1 , p-n; 表示指针当前指向位置的前方- 或者后方第n个数据的位置 而*pn可分别访问相应的元素。,例10-6 main int x, y, a10 , *p ,结果6,15,3,9,5 注意*pn和*pn的区别,2 p; p; 表示指针当前指向位置的前一个 或者后一个数据的位置 则p p指向a5, *p 值为18,3 pp-4 ; pp5 ; 表示指针移到当前指向位置的前4个 p4或者后5个p5数据的位置。 则pp-4,*p; 修改后p指向a0,并取a0的值,结论2和3的操作改变了指针变量本身的值,若 int a10, n3 ,*p,注意1 运算是以指针指向的数据类型长度为计量单位的。 设 int a10, *pa; 则 pp1后, p所指的内存地址加了 2;,若 long b5, *q b ; 则 qq1后, q所指的内存地址加了 4。 对指针p,pn表示的内存地址值为 pn数据类型长度字节数,单目运算遵守右结合,例设 int a10,*p,12 12 13 15 9 13 指a4 指a2 指a3 指a4 指a2 指a3,2. 指针的关系运算,若指针p、q指向相同数据类型如指向数组a,指针的关系运算实际上是两个指向位置的前后比较。 如二指针p、q,若 pq时,则p指向位置在q指向位置之后。,例题输出数组全部元素,main int a5 , i ; fori0;i5;i scanf“d”, ,1、用下标访问,10.3.3 通过指针二维数组和指针,1两个一维数组的嵌套 int a4365,67,70 行首址的概念 a0 60,80,87 a1 90,81,90 a2 99,93,88; a3 2 在内存中按行优先线性存放 int a3465,67,70,60,80,87,90,81,90,99,93,88; aij一维线性地址a首址i*行数j ps; /*p初始指向s数组的首地址*/ s8A /*改变字符数组中保存的值*/ ps8; /*改变p的指向位置 */ pss; /*指向另一个字符数据*/ printf“string is sn”,p; ss ss1 ;,2直接定义字符串常量 char *string“Happy“; 3直接赋予字符串常量 char *string; string“Happy“,注意 指向字符串常量的指针不能被修改另指其他。 如上面的string,操作 stringstring5 ; 出错 2 字符串常量可以赋给字符指针,不能赋给数组 即char s ; s“Happy”; 出错 可修改为 strcpys, “Happy”;,10.4.2 常见的字符串操作,include “stdio.h” main char a40 , b40 ; char *strcpychar *, char *; int strlenchar *; char *strcatchar *, char*; getsa ; printf“bsn”, strcpya,b ; printf“lendn”,strlena; getsb; printf“asn”,strcata,b ; ,例 用指针作为函数的形式参数,编写字符串复制、字符 串联接、求字符串长度的函数。,char *strcpy char *str1,char *str2 1 while *str2*str1 0 str2; str1; return str2; 2 while *str2*str10; return str2 ; 3 while *str2*str1; return str2 ; 4 for ; *str2*str1; ; return str2 ; ,int strlen char *str /*方法一*/ int *pstr; while *p p; return p-str ; /*方法二*/ int len0; while *str len; str; return len ; ,strchar *strcat char *str1, char *str2 char *pstr1; while *p 0 /*第一步*/ p; while *p*str2 ; /*第二步*/ return str1 ; ,str2第一步 将指针移动第一个串的尾部 第二步 将第二个串的内容拷贝到从第一个串尾部以后,/* 1 */,/* 3 */,例10-15 输入两个已经按从小到大顺序排列好的字符串,编写一个合并两个字符串的函数使合并后的字符串,仍然是从小到大排列。/* 确定哪一个是还没有处理完的串*/,指针p指针q指针r10.5 指针数组,10.5.1 指针数组与数组指针,指针数组数组元素为指针 数组指针指向数组的指针,类型 *数组名长度 ;,类型 *指针名长度 ;,int *pa5 int *pb5int *a5, x, y, z; a0,在比较大小的过程中,只修改booki中指针的指向,booki和bookj表示了两个字符数组的首地址,10.5.2 指针数组作main函数的形参,mainint argc,char *argv ,1概念 熟悉的主函数书写main 理解函数 main 由系统调用 问题main 可以带参数吗,2定义格式,3main函数参数特点 其实际参数在命令行输入,传递给形参。 其形式参数的个数和类型是由 c语言规定好的, 但名称可任意。,例 copy命令格式如下 copy a*.* c 功能将a盘上的所有文件拷贝到 c 盘 问题如何用c实现,参数 “a*.*”, “c”如何带入程序 实现main带参数方法,4应用 在编写系统命令时尤为有用。,注意argc值一定大于0,文件 copy.c 中定义 mainint argc, char *argv 若命令行为 c copy a*.* c,例题若在命令行中输入 cfile1 x1 y2 c3 问程序接受的 argc argv,解argc ;,argv0 ; argv1 ; argv2 ; argv3 ;,“file1” “x1” “x2” “x3”,4,所指类型为指针, 一般用来表示一个指针数组的首地址。,10.6 多级指针,3,3,3,定义 含义,int *p;,int funchar *p,int *pn;,int *pn;,char *p形参,int *p;,int p;,指针变量,指针做形式参数,数组指针指针指向一个数组,指针数组数组元素为指针,函数的返回值为指针,函数指针指针指向一个函数入口,指向指针的指针,一、有关指针的数据类型七种,小 结,二、使用方式,1 定义 2 赋初值赋地址 在使用指针变量前,必须先赋初值 3 操作 地址操作行列 内容操作间接访问 ,*,,- 运算符,三、应用,数组一维,二维,字符串 重点 数组元素的表示方式 数组名下标、地址、指针、指针下标 指针使用方式 固定指针将a换成p即可 移动指针一维 每次移动一个元素 二维 每次移动一行 做参数时,共享数组空间,函数 参数为指针 共享空间一般空间, 数组空间, swap重点 函数指针变量 指向函数的入口地址 , 用指针调用函数 返回值为指针 返回结果字符串的首地址 其他 指针数组 数组中的每个元素为指针,用于字符串数组重点 指向指针的指针 二级指针 命令行参数 main函数参数的用法,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值