解释下 传值方式 和 传址方式
发布网友
发布时间:2022-03-25 19:38
我来回答
共1个回答
热心网友
时间:2022-03-25 21:07
问str为什么没有变。然后将void GetMemory改成:
void GetMemory(char **p, int num)
{
*p=(char *)malloc(sizeof(char) * num);
}
str就变了。
问这是为什么?先来看看什么是传值,什么是传址。
传值方式:向函数传递参数时,先复制一份参数,然后才将复制品传给参数。函数中所有对参数的操作,就只是在使用复制品。不会对改变传递前的参数本身。
传址方式:将地址传送给函数,函数对该地址的内容操作,相当于对实参本身的操作。
在一个程序运行时,程序会专门为参数开辟一个内存空间,称为“栈”。栈所在内存空间位于内存的低地址区。当程序需要传递参数时,将一个个参数“压入”栈区内存的底部,然后,函数再从栈区一个个读出参数。
如果一个函数需要返回值,那么调用者首先需要在栈区留出一个大小正好可以存储返回值的内存空间,然后再执行参数的入栈操作。大都数编译器采用“从右到左的次序”将参数一个个压入。因此先将b压栈,再将a压栈。以下面这个程序为例。
//skk_Argument Passing.cpp
#include <iostream>
using namespace std;
int f(int a, int& b)
{
a++;
b++;
return 1;
}
int main()
{
int a=4;
int b=7;
int c(0);
c=f(a,b);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}
参数a是传值,参数b是传址。
很容易看出最后的结果是:
4 8 1
还有一种形式:
void swap (int *a, int *b);
我不太赞成用这种形式(虽然很多时候很有用),最好用
void swap (int &a, int &b);
这是因为使用前一种形式容易出现问题,例如在skk_Argument Passing.cpp加入以下这2个程序段:
void swap1(int *a, int *b)
{
int i;
i=*a;
*a=*b;
*b=i;
}
void swap2(int *a, int *b)
{
int *i;
i=a;
a=b;
b=i;
}
swap1可以起到交换a,b的作用。swap2就不行了。因为本质上来说它们仍然是值传递,只不过这个值是地址,它们都不能改变自己参数本身(指针a和指针b)。swap2完全是一个传值调用。swap1虽然不能改变参数,但是指针太危险了,它间接改变了指针指向int 。因此在这种情况下,我们声明成:
void swap3 (int &a, int &b);
这就告诉该函数有可能改变传递来的变量的值。但是最好在调用的时候在后面注释,因为调用的时候是看不出的,例如调用swap1的时候为swap1 (&a,&b)可以很好给读程序的人提示信息,告诉我们参数可能被修改。调用swap3的时候就是swap3(a,b),无法给出信息,所以最好给注释。即便这样,我仍然偏爱swap3的写法。不过对非const引用参数是不允许做类型转换的,如果可以,那么这样做会毫无意义。因为类型转换的时候需要临时变量
传值和传址的区别是什么
1、在传值中函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。2、传址中压栈的是指针变量的副本,当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。
传值和传址的区别
1、对实参的影响不同。传值是将实参的值传给形参后,实参与形参间便无任何联系,即形参的变化不会对实参产生任何影响。传值时,在形参前用ByVal来界定。传址是形参与对应实参用相同的内存地址,形参的改变将影响实参。2、对形参的影响不同。在传值中函数参数压栈的是参数的副本,任何的修改是在副本...
传值和传址的区别
传值:实际复制的是值,存在两个不同的、独立的拷贝;传址:复制的只是对值的引用。如果通过这个新的引用修改了值,则这个改变对最初的引用来说也可见。在《JavaScript高级程序设计》这本书中有这样一段话:有很多开发人员错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是...
在VB中,"传址"与"传值"到底有啥区别啊?最好举例子说明一下,谢谢啊!
"传址"是传变量的地址,这样可以在函数内引用这个变量 "传值"是传变量的值,相同于把这个变量复制给参数,在函数内不能引用原变量了。打比方,"传址"与"传值"就像身份证与身份证复印件的区别一样。
PHP传值,引用和传址的区别
--传地址:是传值的一种特殊方式,只是他传递的是地址,不是普通的如int那么传地址以后,实参和行参都指向同一个对象--传引用:真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 即传址时只需在函数调用时在参数的前面加上"&"号...
VB中传值参数(byval)和传址参数(byref)有什么区别,求解,谢谢
而按址传递是把这个变量的内存地址(&H11003A10)作为参数传递给函数或过程,那么函数或过程对这个参数进行修改实际上就是对原变量的内存地址进行操作,也就是说原变量的值会相应改变的!通俗来说,传值就是你从存折里取出100元给别人,传址就是你直接把存折和密码给别人,让他自己去取!
在vb中传递参数的方法有几种?分别是?
2种,传值和传址,下面简单介绍一下。byref:缺省方式,按地址传,例如函数A调用函数B,按地址传递变量c作为参数,传递后如B在执行过程中改变c的值,则A中c的值也将改变为B执行后c的值。byval:按值传。例如函数A调用函数B,按值传递变量c作为参数,传递后不管B在执行过程中是否改变c的值,A中c的...
excel的四种参数传递有什么区别?
传值与传址的区别在于,如果在函数体中改变了参数的值,对于传值方式,在主程序(调用该函数处的程序)中是没有影响的,而传址方式会把主程序中相关的变量值改变,可以根据你的需要而定。VB默认是传址方式。调用函数可以是系统的,也可以是自己编写的,一般不需要声明(API 函数除外)。
javascript函数的传值与传址
答:变量存储在内存中,函数调用变量是获取变量在内存中的地址进行调用的,传址方式是函数直接对变量所在的内存地址进行操作,变量内保存的内容被函数修改,传址的方式是函数临时创建一个变量用来保存变量的值,函数操作的是临时变量的地址,这样就原变量中保存的内容不会被函数修改的.2.为什么在JAVASCRIPT声明变量...
VB中关于传值和传地址的问题?
本题可以这样理解:a和b是传值,也就是把x和y的值分别复制到a和b中,然后进行计算;c是传地址,也就是把z命名一个别称叫c,对c的任何改变都会体现到z中,就像一个人有学名有小名,但都是指同一个人。因此,z=c=a+b=5+7=12