C函数参数特性

1 篇文章 0 订阅
1 篇文章 0 订阅

标题:C函数参数特性

作者:白开水

编写日期:2012.5.22

 

前言

C语言,是函数构成的语言,C离不开函数,函数对于C的存在有着决定性的作用。那么,函数参数对于C的重要性也就可想而知了。

下面我就谈谈C函数参数的一些性质。

 

参数特性简介

特点一:函数参数的传递顺序。

实例一

void func( int id1 , int id2 )

{

              printf  ( “func()->id1=%d,id2=%d” , id1 , id2 );

}

 

void main (  )

{

              int id1 = 10 ;

              func ( ++id1 , ++id2 );

}

请问这输出什么?

运行结果:func()->id1=12,id2=11

怎么会这样呢?怎么可能这样呢?按照我们的思维方向——从左到右,应该是func()->id1=11,id2=12呀!怎么会是反的呢?真奇怪!

冥思苦想吧,终于可又得出一个结论:函数参数的传递顺序是从右向左传递的。

 

 

特性二:函数参数的首、末地址。

实例二

int func1 ( int id1 , int id2 )

{

              return printf  ( “func1 ()->&id1=0x%x,&id2=0x%x\n” , &id1 , &id2 );

}    

int func2( int id1 , int id2 , int id3 , int id4 )

{

              return printf ( “func2 ()->&id1=0x%x,&id2=0x%x,&id3==0x%x,&id4=0x%x\n” , &id1 , &id2, &id3 , &id4 );

}

调用这两个函数,请问它们分别输出什么?

在这里,输出的是参数的地址,输出结果为:

func1 ()->&id1=0x12ff2c,&id2=0x12ff30

func2 ()->&id1=0x0x12ff24,&id2=0x12ff28,&id3==0x12ff2c,&id4=0x12ff30

这样的结果意味着什么呢?最后一个参数的地址都是一样,从后起往左走,一样的步长(4个字节)地减小。

这也就是说函数参数的首地址是随着参数个数进行变化的,末地址是不变的,也就是末地址是确定的

       注:参数的末地址可能根据各种原因进行变化的,并非都为 0x12ff30

 

 

特点三:可变参数。

实例三

int func ( const char *format , … )

{

              va_list  vl;

              int result = 0;

 

              va_start ( vl , format );

              result  = vprintf ( format , vl );

              va_end ( vl );

      

              return result;

}

请问这样的参数对吗?如果对,有什么理由这样写?

这样的参数写法是正确的,称作可变参数。有了特点二的帮助,那么这个问题就能很好地回答了。

如实例3所示的代码,即函数参数在被调用的时候,参数首地址可以确定,参数个的步长可以确定,参数的个数可以确定,也即参数末地址可以确定了。

       为什么参数不写成 …,const char *format呢?我想在以上的解释中,你应该明了啦。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值