C语言 变量作为函数定义中的实参写法

2015 0606        一直在用数组作为实参,因为在函数定义中,数组名等同于数组第一个数据的地址,所以用作实参的时候很方便(因此,想要通过函数改变数组中的数据是比较方便的)。但是今天编程的时候遇到的问题就是,一旦变量不是全局变量,它在各种函数内使用和修改受到很大局限,所以查找了一下变量作为函数定义里实参的用法。百度里的错误例子:#include int show1(int
摘要由CSDN通过智能技术生成

2015 0606

        一直在用数组作为实参,因为在函数定义中,数组名等同于数组第一个数据的地址,所以用作实参的时候很方便(因此,想要通过函数改变数组中的数据是比较方便的)。但是今天编程的时候遇到的问题就是,一旦变量不是全局变量,它在各种函数内使用和修改受到很大局限,所以查找了一下变量作为函数定义里实参的用法。

百度里的错误例子:

#include <stdio.h>

int show1(int number);

int show2(int number1);

int main(void)
{
    int number = 10;
    int number1=3;
    show1(number);
    show2(number1);
    return 0;
}
int show1(int number)
{
    printf("\n show1 *pnumber is : %d,and pnumber's address is :%p\n",number,&number);
    return 0;
}
int show2(int number1)
{
    printf("\n show2 *pnumber is : %d,and pnumber's address is :%p\n",number1,&number1);
    return 0;
}
关于上述程序,百度里别的人回答:

(1)这是因为C语言的函数参数传递是按值传递的,不是按地址传递,参数从实参传递给形参时是拷贝一份然后传递,不影响原来参数的值。并且下次再传递时还是占用这一块临时区。所以地址是一样的

(2)这个就是C语言的所谓“值传递”
1)虽然你传递的参数不同,num1,num2;但是C编译出来不会把num1/2本身地址传递进去,只是把值传递进去
2)把值传递进去就意味着不使用原来的&num1,&num2两个内存单元来储存这个值,所以系统要提供其它的内存单元来存储和传递这个值。
3)具体使用什么样的内存单元来来储存和传递这个值则是C语言相关也是体系相关。X86使用stack来传参数,ARM/MIPS则使用寄存器来传参数。
4)在X86的体系内,会分配一个4字节的stack地址来存储你的参数,所以打印出来的是该stack单元地址
5)你的两个函数调用都是一个入参数,也就是进入时分配一个stack,退出时释放该stack,所以打印出来的stack地址总是一样的
6)你可以尝试改成shownum1传入2个入参(num1,num2),然后里面在嵌套调用shownum2也是两个入参(num1,num2),打印出来的地址绝对是不一样的。因为show1的stack还没有释放,机械调用show2,它就不能重复利用show1的stack地址了。

接着是百度里正确的程序:

#include <stdio.h>
int   show1( int *number); //其实这里形参名称最好是不同于实际数据名称的,这样容易混淆。另外,函数声明时是不需要写明形参或者实参名称的
int  show2( int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值