c++调用函数传值传参

先回顾一下上次我的指针博客

今天看书时候发现一个东西看不懂,不懂就查,不能一直半解

int *find(const vector<int> &vec,int value){

//省略.......

}

elemType* find(const elemType * array,int size,const elemType &value){

//省略.........

}

问题就在参数列表(应该是这么叫吧,不这么叫我回来修改)位置处为什么一会是&,一会是 *。

然后往前翻,结果翻到了相关知识点,正好恶补了一下。

www.broadview.com.cn/20934这是源码网站,但是打不开,害,还得自己敲

 先夸一夸,这个思路真牛,不愧是lip(gallager)(哈哈)

代码自己敲的,经过调试,可以正常使用

#include <iostream>
#include <vector>
using namespace std;

void display(vector<int> vec)
{
	for(int ix=0;ix<vec.size();++ix)
		cout<<vec[ix]<<" ";
	cout<<endl; 
 } 
 
 void swap(int val1,int val2)
 {
 	int temp=val1;
 	val1=val2;
 	val2=temp;
 }
 
 void bubble_sort(vector<int> vec)
 {
 	for(int ix=0;ix<vec.size();++ix)
 		for(int jx=ix+1;jx<vec.size();++jx)
 			if(vec[ix]>vec[jx])
 				swap(vec[ix],vec[jx]);
 }
 
 int main(){
 	int ia[8]={8,34,3,13,1,21,5,2};
 	vector<int> vec(ia,ia+8);
 	
 	cout<<"vector before sort:";
 	display(vec);
 	
 	bubble_sort(vec);
 	
 	cout<<"vector after sort:";
 	display(vec);
 	
 }

我们可知并无任何变化 

在没有断点调试时候应该怎么办呢?那我们就要对这几个函数分别进行分块分析了

修改bubble_sort里面的函数

 void bubble_sort(vector<int> vec)
 {
 	for(int ix=0;ix<vec.size();++ix)
 		for(int jx=ix+1;jx<vec.size();++jx)
 			if(vec[ix]>vec[jx]){
 			cout<<"about to call swap"
 				<<"ix: "<<ix<<"jx: "<<jx<<"\t"
 				<<"swapping: "<<vec[ix]
 				<<"with"<<vec[jx]<<endl;
 			swap(vec[ix],vec[jx]);
			 }
 }

结果为 

 

 我们可以发现一件事,swap()的确被调用了但是原来的vector仍然没有改变  意思是这样的,她是会每一次去查找符合要求的,但是每次的值固定不变

再思考,是不是swap()问题

void swap(int val1,int val2){
	cout<<"swap("<<val1
	<<","<<val2<<")\n";
	
	int temp=val1;
	val1=val2;
	val2=temp;
	
	cout<<"after swap(): val1 "<<val1
	<<"val2: "<<val2<<"\n";
}

可知bubble_sort正确的辨识出第一和第三个元素,其值分别是8和3,因此两个元素必须交换。swap()被成功调用,而且在swap()函数中两个值也的确交换了。但是,vector内部的值依然没有改变。

此时,我们因该考虑到参数传给swap()的传递方法

经过思考,可以解释为什么虽然将两值交换,其结果却没有反映到vector内的数值上。是的,其实传给swap()的对象被复制了一份,原对象和副本之间没有任何关系。 

当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序堆栈”。这块特殊区域提供了每个函数参数的储存对象。它也提供了函数所定义的每个对象的内存空间------我们将这些对象称为局部对象。        一旦函数完成,这块内存就会被释放掉,或者说pop出来

所以上述步骤 一直是在传值(复制),并没有传参  所以做一下小修改,让其传参,令swap()的参数和传入的实际对象产生关联

void swap(int &val1,int &val2){
	cout<<"swap("<<val1
	<<","<<val2<<")\n";
	
	int temp=val1;
	val1=val2;
	val2=temp;
	
	cout<<"after swap(): val1 "<<val1
	<<"val2: "<<val2<<"\n";
}

void swap(int &val1,int &val2)                pass by reference 将参数声明为一个reference(地址)

 我们可知除了main传给Bubble_sort()的vector未改变之外,每样事物都工作正确。

函数参数的传递应该采用传址,而不是传值

因为当我们将vec[ix]这样的对象传入函数,默认情形下其值会被复制一份,成为参数的局部性定义,这种叫传值。        void bubble_sort(vector<int> vec)是复制进去的值,所以swap也是里面修改,不影响外面的值

例如在void bubble_sort(vector<int> vec)中进行即使是进行双层循环后,即使是void swap(int &val1,int &val2) ,在交换数据时,是直接操作本体,不是复制的值,但是,函数参数的传递依然是传值

 修改为void bubble_sort(vector<int> &vec)

以上 

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 可以通过 C++ 模块来扩展其功能,实现 C++ 模块函数的调用需要使用 Node.js 提供的 `N-API` 接口。下面是一个简单的例子,演示了如何在 C++ 模块中实现一个函数,并在 Node.js 中调用该函数并传递参数。 C++ 模块代码: ```cpp #include <node_api.h> napi_value add(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); int32_t a, b; napi_get_value_int32(env, args[0], &a); napi_get_value_int32(env, args[1], &b); napi_value result; napi_create_int32(env, a + b, &result); return result; } napi_value Init(napi_env env, napi_value exports) { napi_value fn; napi_create_function(env, nullptr, 0, add, nullptr, &fn); napi_set_named_property(env, exports, "add", fn); return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) ``` 上述代码定义了一个 `add` 函数,该函数接受两个整数参数,返回它们的和。然后将该函数导出为 Node.js 模块的一个属性。 在 Node.js 中调用该函数: ```javascript const addon = require('./build/Release/addon'); console.log(addon.add(1, 2)); // 3 ``` 上述代码首先通过 `require` 函数引入了 C++ 模块,然后调用了模块的 `add` 函数,并传入两个整数参数。`add` 函数返回它们的和,该和被输出到控制台上。 这是一个简单的例子,演示了如何在 C++ 模块中实现函数,并在 Node.js 中调用该函数并传递参数。具体实现方式可以根据实际情况来进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值