浅谈C语言中函数形参为地址类型定义形式和类型自动转换.docVIP

浅谈C语言中函数形参为地址类型定义形式和类型自动转换.doc

  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文档。上传文档
查看更多
浅谈C语言中函数形参为地址类型定义形式和类型自动转换

浅谈C语言中函数形参为地址类型定义形式和类型自动转换   摘要:当函数参数为地址类型时,可以有多种定义形式,因而读者易产生迷惑,通过对各种实例的分析和证明,介绍了按各种形式定义的参数的本质;同时研究了当地址类型实参和形参类型不同时的自动转换。   关键词:地址;形式参数;实际参数;类型转换   中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)29-0118-02   当函数形式参数(简称形参)类型为普通类型的数值类型时,参数的定义形式以及不同当形参和实参类型不符时发生的自动转换,各类教科书已进行了详尽讲解。而当函数形参类型为地址类型时,它的定义形式多种多样,而且当地址类型实参和形参发生类型不匹配时的数据转换,还很少有资料专门研究总结。   本文针对这些问题,通过举合适的例做了证明和研究,对各种地址类型的形参的形式及本质做了总结,同时研究了地址类型数据的自动转换。   1 函数形参为一级指针   当函数形参类型为一级指针(即普通变量的地址)时,它的形式通常有一级指针和普通一维数组两种形式。   void fun1(char *a) //此处等价于(char a[ ]),数组的维数无需指出   { int i;   for(i=0;i=5;i++)   { putchar(*(a+i)); //此处等价于putchar(a[i]);   }   }   main( )   { char b[]=a1b2c3;   char *p;   p=b; // 等价于 p=b[0];   fun1(b); // 等价于fun1(p);   }   此处形参的两种定义形式char *a与 char a[ ]是等价的,形参a的本质就是一个一级指针(指向普通变量的指针)。当我们需要对数组变量操作时,形参通常写成数组的形式,更加便于读者的理解,而当对普通变量操作时,形参通常写成一级指针形式。程序执行结果如图1。   2 函数形参为数组指针   当函数形参类型为数组指针(指向一维数组的指针)时,其形式通常为数组指针(很多资料中也称为行指针)和二维数组。   void fun1(char (*a)[4]) //此处等价于(char a[ ][4]),数组的第一维无需指出   //若参数说明为char a[ ][ ],则编译就会发生错误,二维数组必须指定列维数   { int i;   for(i=0;i3;i++)   puts(*(a+i)); //此处等价于 puts(a[i])   }   main()   { char b[3][4]={abc,xyz,aaa};   char (*p)[4];   p=b; // 此处等价于 p=b[0];   fun1(p); //fun1(b);运行结果都一样   }   程序运行结果为:   了解了数组指针形式的本质后,我们可以把数组指针扩展到多维数组,比如对于三维数组形式,void fun( char p[ ][4][3])和void fun( char (*p)[4][3])是等价的。   3 函数形参为二级指针   当函数形参类型为二级指针(指向一级指针的指针)时,它的形式通常有二级指针形式和指针数组形式。   void fun(char **a) //此处等价于(char *a[ ])   { int i;   for(i=0;i3;i++)   puts(*(a+i)); //或puts(a[i])   }   main( )   { char *p1[3],**p2;   char b[3][7]={abccde,deawff,gaaahi};   p1[0]=b[0];   p1[1]=b[1];   p1[2]=b[2];   p2=p1[0]; /p1[0]存放的是地址 ,p1[0]则是p1[0]的地址,也即指针的指针   fun(p2);//等价于fun(p1)   }   程序运行结果为:   对于此处指针形式的研究,可以参照在1中分析的 char *a与char a[ ]作为参数形式时本质是一致的,那么char **a与char *a[ ]也是一致的,我们已经做实验验证。   在实际编程中,读者可依据自己的喜好选择参数的定义形式,通常情况下,指针数组的形式更加易于理解,但当我们探究清楚参数类型的本质后,就可以灵活自如使用。   在1、2和3中我们总结了有关形式参数类型为地址类型的各种定义形式,并且在实际调用中,实参的类型和形参都一致,那么当函数调用?r,实参并不是和形参同样类型的地址数值时,又会发生什么样的情况?   4 指针类型数据

文档评论(0)

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

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

1亿VIP精品文档

相关文档