返回信息流void test(int arg1,int *arg2)
{
printf("%d and %d",arg1,*arg2)
}
有人这样写
void test(int arg1,int * arg2)
{
int tmp1 =arg1;
int * tmp2 =arg2;
printf("%d and %d",tmp1,*tmp2)
}
什么情况下需要把参数变量的值赋给局部变量呢?这样做编译器会不会把局部变量优化掉,直接引用栈帧上面的压栈参数?
另外,问个白痴的问题,为什么需要局部变量呢,把局部变量全部搞成参数可以吗,这样难道就成了lisp那种函数式编程?
C/C++和java是不是参数传递方式都是值传递?
看到有的地方讲C的三种参数传递方式是 传值,传指针,传引用,我的理解是后两种其实是一回事,目的都是改变实参,但和第一种从根本上也没区别,只不过传入的是实参的地址的值。
对应于java,讲的是值(基本类型)和引用传递,但本质上,引用传递也只是对象地址的值。
所以有的地方讲这两种语言有的只是值传递也是没错的。
这是一条镜像帖。来源:北邮人论坛 / cpp / #92228同步于 2016/6/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
参数变量和局部变量区别?
henceman
2016/6/15镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你说为什么要有局部变量呢?
另外,java没有“按引用传递”(pass by reference),只有“按值传递”(pass by value)
【 在 nuanyangyang 的大作中提到: 】
: 你说为什么要有局部变量呢?
: 另外,java没有“按引用传递”(pass by reference),只有“按值传递”(pass by value)
暖神,局部变量是不是都能用某种方式替换,如果C语言参数数量不受限制(好像是大于6个就得弄个地址传进去),那么是不是局部变量就可以参数+表达式的形式代替?参数和局部变量的作用域 生存期不都是受限于函数体吗?
这倒不是关键。关键是没有局部变量的话,编程很不舒服啊。
【 在 henceman 的大作中提到: 】
: 暖神,局部变量是不是都能用某种方式替换,如果C语言参数数量不受限制(好像是大于6个就得弄个地址传进去),那么是不是局部变量就可以参数+表达式的形式代替?参数和局部变量的作用域 生存期不都是受限于函数体吗?
个人觉得,你举的这个例子,局部变量并没有什么卵用
```
void test(int arg1,int * arg2)
{
int tmp1 =arg1;
if(tmp1==2)
{
tmp1=tmp1*2;
}
printf("%d and %d",tmp1,arg1)
}
```
类似这种,大概意思是说,你传进来,局部变量接住
之后局部产量你想怎么改就改好了,但是传进来多少后面可能还要用
其实现代编译器都可以消除这里面的大多数局部变量。比如llvm,局部变量和参数都叫value。
【 在 changzhu 的大作中提到: 】
: 个人觉得,你举的这个例子,局部变量并没有什么卵用
: [md]
: ```
: ...................
局部变量跟函数参数传递混起来讨论总感觉有点牵强
局部变量跟全局变量\static变量一起讨论还差不多,不用局部变量难道是用全局变量吗?
函数参数怎么传递,通过值、指针、或者引用,到底来说还是看你的函数是需要什么功能,需要怎么得到函数执行结果。
不知道你在纠结什么,在你问a和b有什么区别的时候应该隐含着a和b有很大的联系和相似。。。你问的这两者我除了他们都是变量之外看不出来有什么太深的联系。。。你举的例子中的局部变量没什么用,相信也没谁会这么写,但是自有别的用处,比如4楼那样用。你觉得4楼那样好还是
printf("%d and %d",arg1==2 ?arg1*2:arg1,arg1);这样好?