[工学]第6章_指针_3.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[工学]第6章_指针_3

指针和函数  在C语言中,可以很方便地把指针和函数结合起来使用。 指针可以作为函数参数 作为函数的返回值 还可以定义函数指针,使其指向某个函数 指针作函数参数 以下面三种情况讨论: 用指针作参数传递变量 用指针作参数传递一维数组 用指针作参数传递二维数组 用指针作参数传递变量 修改后: void swap(int *x, int *y){//指针方式,传地址 int temp = *x; *x = *y; *y = temp; } void main(){ int a =1, b =2; int *pa = a; int *pb = b; printf(交换前:a=%d;b=%d\n,a,b); swap(pa, pb); printf(交换后:a=%d;b=%d\n,a,b); } 看栈示意图,理解参数传递机理 用指针做参数,要注意以下几点 函数参数声明为指针  void swap(int *x, int *y)  等价于:void swap( int x[ ], inty[ ] ) 在函数体中使用间接引用  *x = *y; 调用时,用地址作实参  swap(pa, pb);//pa,pb为指针  等价于: swap(a, b); 用指针作参数传递一维数组 指针和数组作为函数参数,传递的都是地址值 对一维数组,传递数组名和传递指针可互换 在函数中,使用下标运算和间接运算等价 请注意和传递数组中某个元素区别 如: 用指针作参数传递二维数组 传递二维数组名,在这种方式中,作为形参的二维数组名被自动转换成行指针 二维数组应用实例:矩阵运算  以矩阵转置运算为例,比较用指针和数组名传递二组数组的差别 思考: 函数声明 void transposition(int array_bef[2][3], int array_aft[3][2]) 能否修改为: void transposition(int array_bef[2][ ], int array_aft[3][ ]) 或者: void transposition(int array_bef[ ][3], int array_aft[ ][2]) 行指针传递二维数组 回忆行指针的定义方式 通用转置函数 在使用行指针时,函数定义中必须要指明每行包含元素的个数,否则在函数体中,编译器无法计算from+i实际值。 函数transposition()实现了固定维度的矩阵转置, 实现一个通用矩阵转置函数,可以把二维数组按一维数组方式进行处理 ,修改函数原型为:  int transposition(int m, int n, int *a); 用指针数组作参数传递多个字符串 从逻辑上看,指针数组兼具一维和二维的性质。 如果把字符串作为基本对象来考虑,它是一维的; 如果分别考虑每个单独的字符,它又具备二维性质。 指针数组在字符串处理函数中很常见。 字符串表的排序 问题:已知字符串数组 char *names[] ={Paul J.Deitel,Martin Kalin,Erics S. Roberts,Dennis M. Ritchie};  设计一函数按字母表顺序对其排序 排序前: 排序后: 函数原型与测试程序 实现 练习: 请自己实现函数 void printStringArray(int size, char * a[ ]); 指针作函数返回值 利用变量名,函数可以返回一个值,函数也可以返回指针值,这类函数称为指针型函数,其定义形式为: 类型标识符 *函数名(参数列表) 例如:int * larger(int *x, int *y) 表示函数larger( )返回一个整型指针给调用者。(调用者必须接受该指针返回值吗?) 例子: 注意: 在返回指针值时,注意不能返回被调用函数中的局部变量的地址,这样会产生错误。因为该变量的存储空间被分配在栈区,即函数的局部调用环境中,当函数返回时,其空间就不再有效,因而会出错。 上面的例子中,函数larger为什么是合理的? 返回的实参的地址。 实参是存放在调用者的栈帧中。 请回忆函数调用栈示意图 以下程序有什么问题? 函数指针 函数中的程序代码需要占据一定的存储空间,该代码的首地址称为函数的入口地址(函数名代表该入口地址)。如果定义一个指针保存入口地址,该指针称为函数指针。可以用函数指针代替函数名来调用函数。 如已知函数: int larger(int x, int y) 现定义一指向函数的指针: int (*fnptr)(); 注意:*fnptr两侧的括号是必须的,因为()运算的优先级高于*运算。 函数指针定义后,它能被赋值、也可作为参

文档评论(0)

skvdnd51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档