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