首页

文章

解释下 传值方式 和 传址方式

发布网友 发布时间: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引用参数是不允许做类型转换的,如果可以,那么这样做会毫无意义。因为类型转换的时候需要临时变量
2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 3岁孩子不会说话,应该挂什么科? 3岁小孩不会说话正常吗 鹿茸炖乌鸡怎么做? 新型冠状肺炎吃什么药可以预防 冰箱上电后一直响 食品生产许可证编号开头为“ G”。 库存过期香精 猎狐点卡平台经营范围 电影代理靠谱吗 兄弟三人,有什么好的QQ网名 租赁合同书范本简单版 VB中传值和传地址有什么区别 VB参数参数传递中,传值与传址的区别 什么是传值,什么是传址(引用)?对此,C/C++与Java中的函数(方法)有什么不同? Java参数传递中的传值和传址的区别 C语言中传值与传址有什么区别 C 语言传址调用和传值调用有什么区别 C语言中传值和传址的区别 VB传值和传址的区别~~~ 参数传递的“传值”和“传址”有什么区别 传值和传址的区别 iPhone xs 和 iPhone xs max 到底有什么区别 苹果xs max256g多少钱 港版iPhone xs Max和美版无锁iPhone xs Max那个好? 买苹果xs好还是买xs max好? 苹果哪款有双卡双待? iPhone xsMax美版无锁港版双卡那个好啊? 别人拿苹果12mini,256g换我的苹果xs max256g,你们觉得哪个好? 有谁懂苹果手机xs mas 苹果xsmax256的型号? iphone xs max国行版64G市场售价多少?支持双卡吗? C语言传值和传地址的区别! PHP传值和传引用,传地址的区别 VB中数据传递的传值和传址的区别 C语言中传值和传地址有什么差别,怎么用的 传值和传引用,传地址的区别是什么 在VB中传值调用和传址调用的区别????? python关于函数的传值和传址到底是怎么回事 C++关于函数的传值和传地址传引用的区别? 华为p10能支持40w快充吗? 华为p10支持快充吗 华为 P10有快充技术吗? 华为p10快充是多少w? 华为p10能不能66W超级快充? 华为p10有快速充电吗 华为P10是快速充电吗 华为p10能用快充吗 华为p10有超级快充吗 华为p10有快充的功能吗 华为p10可以快冲吗 华为手机P10支持快充吗
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com