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)

以上 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415777.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,入门教程(07)——软件项目的源文件与目录结构

上一篇&#xff1a; C#&#xff0c;入门教程(06)——解决方案资源管理器&#xff0c;代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后&#xff0c; Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…

.net core 6 使用注解自动注入实例,无需构造注入 autowrite4net

像java使用autowrite一样使用 1、前提先注册到ioc容器当中 builder.Services.AddScoped 2、nuget引入AutoWrite4Net 3、启用 //启用自动注入 app.UseAutoWrite(); 4、在类上使用注解 [StartAutoWrite] public class NacosController : ControllerBase 5、实例上使用注解 …

Parade Series - RTSP - Web

Cron Startup Scripts └─ lt-init.cmd├─ lt-server.cmd│ └─ lt-rtsp-proxy-server.cmd│ └─ lt-rtsp-proxy-agent.cmd└─ lt-push.cmd└─ lt-rtsp-cam-daemon.cmd└─ lt-rtsp-cam-worker.cmdlt-init.cmd :: :: PLEASE DO NOT EDIT THIS FILE :: ECHO OFF…

使用Python的pygame库实现下雪的效果

使用Python的pygame库实现下雪的效果 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图&#xff1a; 源码如下&#xff1a; import pygame import random# 初始化pygame pygame.init()# 设置屏幕尺寸 width…

【办公类-21-03】20240119 提取不连续的男女学号 set()和list法

背景需求&#xff1a;了解班级幼儿性别比例 查看点名册&#xff0c;发现中4班最初的学号是按照先男后女的方式排列&#xff0c;但是随着幼儿转出&#xff0c;空出一些学号&#xff0c;于是新插班的孩子就插入空的学号&#xff0c;空格插完了&#xff0c;就排在学号尾部。 我想…

「优选算法刷题」:盛最多水的容器

一、题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器…

【AI接口】语音版、文心一言大模型和AI绘图、图片检测API

文章目录 一、语音版大模型AI1、接口2、请求参数3、请求参数示例4、接口返回示例 二、AI图片鉴黄合规检测API1、接口2、请求参数3、请求参数示例4、接口返回示例5、报错说明6、代码开源 三、人工智能AI绘画API1、接口2、请求参数3、请求参数示例4、接口返回示例5、AI绘画成果展…

字符串系列之滑动窗口

大家好&#xff0c;滑动窗口算法一般是作用在字符串或者数组上&#xff0c;通过不断的滑动逻辑窗口&#xff0c;在特定窗口大小内进行计算的过程。滑动窗口的方式可以降低时间复杂度&#xff0c;从而减短计算的执行时间。 比如说在字符串s"5189623196" 中&#xff0…

【51单片机Keil+Proteus8.9】AT89C51+7段数码管两位计数器

两位计数器显示 设计思路 电路设计 使用AT89C51单片机&#xff0c;外部引出两个管脚P3^3和P3^4当作按钮分别作为start和stop&#xff0c;对计时状态进行控制&#xff0c;由于是两位计数器&#xff0c;引出两个管脚P3^0和P3^1作为两个数码管的片选信号&#xff0c;工作时快速…

每日温度00

题目链接 每日温度 题目描述 注意点 列表对应位置的输出为&#xff1a;要想观测到更高的气温如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替 解答思路 利用栈先进后出的特点将低温度的下标存储到栈中&#xff0c;如果当前温度比栈顶下标对应温度更高&#…

2024--Django平台开发-订单项目管理用户认证+动态菜单+权限控制(十三)

day13 订单管理项目开发 1.表结构设计 1.1 abstract类 from django.db import modelsclass ActiveBaseModel(models.Model):active models.SmallIntegerField(verbose_name"状态", default1, choices((1, "激活"), (0, "删除"),))class Meta:…

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中&#xff0c;前端通过以下三种方式来与后端进行交互&#x1f31f; ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对&#xff0c;一般用doGet方法进行交互 代码如下 …