C++基础与深度解析01——函数基本组成+函数传参的三种方法

news2024/12/23 10:52:37

0.前期准备

请安装Visual Studio
并学习基本的新建项目、新建CPP文件以及运行代码。

1.从Hello World 开始

1.1代码内容

函数功能:打印“Hello World”

#include<iostream>
int main()
{	
	std::cout << "Hello World" << std::endl;
	return 0;
}

1.2 相关知识点

1.函数构成
输入参数列表+函数名+返回类型+函数主体
如下图所示,但是main函数稍有特殊,其为cpp
在这里插入图片描述
现举一个简单函数的例子,z= 2x-3y+3,其中xy均为浮点型小数,取函数名为CalBinFun,函数输入列表应包括x、y,返回值类型为float,函数代码如下:
注意:return 返回的数据,其数据类型必须和函数定义的返回值类型一致,即如下代码第三行z的定义必须为float。

float CalBinFun(float x, float y)
{
	float z = 2 * x - 3 * y + 3;
	return z;
}

可以在如下主函数中对以上函数进行反复调用

int main()
{	
	std::cout << CalBinFun(1.1,3.5)<< std::endl;
	std::cout << CalBinFun(2.9, 0.5) << std::endl;
	return 0;
}

2. 形参列表详解

上文提到的函数输入参数列表,其名称为形参列表,在函数定义过程中,其有多种使用方法,现进行详细介绍

2.1 形参和实参

用于接收传递值的变量被称为形参;传递给函数的值被称为实参
发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
如在上文函数CalBinFun中,float x, float y为形参,在调用函数之前,我们不知道其具体数值,只知道其数据类型, CalBinFun(1.1,3.5)1.1,3.5为实参,我们知道其具体数值,当算法执行float z = 2 * x - 3 * y + 3;时,其中形参xy分别为1.13.5,因为调用函数时,将实参赋值给形参。
函数调用时,实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误

2.2 三种函数参数传入方式

2.2.1 原理及是否修改主函数中实参的值

2.2.1.1值传参

将主函数中w的数值复制给PrWord01中的word,两个变量地址不同,在PrWord中改变Word的值不会影响主函数中w的值。

#include<iostream>
#include<string>
using namespace std;
//值传递
void PrWord01(int word)
{
	cout << "First:   " << word << endl;
	cout << "Address fun:   " << &word << endl;
	word = 2;
	cout << "Second:   " << word << endl;
}
int main()
{
	int w =20;
	PrWord01(w);
	cout << "After Print-> main:   " << w << endl;
	cout << "Address fun:   " << &w << endl;
	return 0;
}

在这里插入图片描述

2.2.1.2指针传参

:将主函数中w的地址传递给函数PrWord02的word指针,word指针存储值为w的地址,在函数PrWord02中修改*word的值,即修改word存储的地址(也是主函数w地址上的值),所以指针传递方法修改形参的值,也就是修改了实参的值。

//指针传递
void PrWord02(int *word)
{
	cout << "First:   " << &word << endl;
	cout << "First:   " << word << endl;
	cout << "First:   " << *word << endl;
	*word = 2;
	cout << "Second:   " <<*word << endl;
	cout << "Second:   " << word << endl;
}
int main()
{
	int w =20;//002
	PrWord02(&w);
	cout << "After Print-> main:   " << w << endl;
	cout << "Address fun:   " << &w << endl;
	return 0;
}

在这里插入图片描述

2.2.1.3引用传参

引用的本质是别名,相当于子函数中word是主函数中w的别名,其地址一致,修改子函数中形参也会修改主函数中实参。

#include<iostream>
#include<string>
using namespace std;
//引用传递
void PrWord03(int &word)
{
	cout << "First:   " << &word << endl;
	cout << "First:   " << word << endl;
	word = 2;
	cout << "Second:   " << word << endl;
}

int main()
{
	int w =20;
	PrWord03(w);
	cout << "After Print-> main:   " << w << endl;
	cout << "Address fun:   " << &w << endl;
	return 0;
}

在这里插入图片描述
相比于前两者,引用传参是最省内存的方式,但是大多数情况,我们不想在子函数中修改主函数中的变量,只需在形参前加上关键字const,这样便无法修改形参,如下图对word的修改已经标出错误。
在这里插入图片描述

2.2.2 Hello World的三种传参方式(作业)

以下给出字符串打印函数的三种传参方式,作为读者的练习参考答案

2.2.2.1 字符串方式

void PrWord01(string word)
{
	 cout <<"First:  "<< word <<  endl;
	 word = "changed";
	 cout << "Second:  " << word << endl;
}
void PrWord02(string *word)
{
	cout << "First:  " << word << endl;//存储的地址
	cout << "First:  " << *word << endl;//解引用:* 表示其保存的地址上保存的值
	*word = "changed";
	cout << "Second:  " << word << endl;
	cout << "Second:  " << *word << endl;
}
void PrWord03(string &word)//word 相当于取别名 word和w指向同一地址 保存相同的值 注意 一经引用&word不可以修改
{
	cout << "First:  " << word << endl;//word的值
	cout << "First:  " << &word << endl;//word的地址 
	word = "changed";
	cout << "Second:  " << word << endl;
	cout << "Second:  " << &word << endl;
}
void PrWord03(const string &word)//运行会报错 加了const word不可修改
{
	cout << "First:  " << word << endl;
	cout << "First:  " << &word << endl;
	word = "changed";
	cout << "Second:  " << word << endl;
	cout << "Second:  " << &word << endl;
}

2.2.2.2 字符数组方式

#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
//值传参  数组传参没有值传递  所谓值传参就是传递指向数组首地址的指针参数,与指针传参等效
void PrWord01(char word[])
{
	printf("01__________Address of word   %x \n", &word);
	printf("01__________Value of word   %x \n", word);
	printf("01__________Value of Value of word   %s \n", word);
	word[0] = 'h';
	printf("01__________After changed  Value of Value of word   %s \n", word);


}

//指针传参
void PrWord02(char  *word)
{
	printf("02__________Address of word   %x \n", &word);
	printf("02__________Value of word   %x \n", word);
	printf("02__________Value of Value of word   %s \n", word);
	word[1] = 'E';
	printf("02__________After changed  Value of Value of word   %s \n", word);


}

//引用传参
void PrWord03(char (&word)[12])//引用传递 必须输入数组长度  word是w的别名 其首地址和w首地址一致 
// 如果不想修改主函数中w 写成    void PrWord03(const char (&word)[12])/
{
	printf("03__________Address of word   %x \n", &word);
	printf("03__________Value of word   %x \n", word);
	printf("03__________Value of Value of word   %s \n", word);
	word[2] = 'L';
	printf("03__________After changed  Value of Value of word   %s \n", word);


}
int main()
{
	char w[] = "Hello world";
	printf("Address of w   %x \n", &w);
	PrWord01(w);
	printf("After PrWord01-> main:   %s  \n", w);

	PrWord02(w);
	printf("After PrWord02-> main:   %s  \n", w);
	PrWord03(w);
	printf("After PrWord03-> main:   %s  \n", w);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习babylon.js --- [1] 初次体验和安装

babylon.js是微软推出的Web3D库&#xff0c;本文写作时版本是6.x&#xff0c;官方介绍如下&#xff0c; 看这意思是6.x系列的版本大大提高了性能&#xff0c;并提供了很多新特性。其Github地址是https://github.com/BabylonJS/Babylon.js 本篇文章讲述使用babylon.js的初次体…

申请阿里云服务器并搭建公网可支持数据上传的HTTP服务器

1. 前言 拥有一台自己的云服务器可以做很多事情。阿里云服务器毫无疑问是国内最好的。 阿里云服务器可以用于各种互联网应用的搭建和运行&#xff0c;提供稳定、高性能的服务。 阿里云服务器的用途&#xff0c;包括但不限于以下几个方面&#xff1a; 网站托管&#xff1a;可以将…

常用adb命令整理

一、adb介绍 adb&#xff1a;Android Debug Bridge&#xff0c;Android 调试桥的缩写&#xff0c;adb 是一个 C/S 架构的命令行工具&#xff0c; 主要由 3 部分组成&#xff1a; 运行在 PC 端的 Client : 可以通过它对 Android 应用进行安装、卸载及调试运行在 PC 端的 Serv…

Python实现校园网自动连接

用过校园网的小伙伴可能深有体会&#xff0c;在连接上校园网之后&#xff0c;需要再进行一个用户认证&#xff0c;才算真正的连接成功。这就会带来一些问题&#xff0c;比如若在长时间内没有网络请求&#xff0c;用户认证就会失效&#xff0c;它会自动断开校园网&#xff0c;这…

Android 系统开发工具

Android 系统开发工具 1、SSH 服务与 Tabby Terminal1.1 配置 Ubuntu ssh 服务 2、Samba 服务器搭建3、Idegen Android Studio 查看源码3.1 修改android.iml文件 (可选) 4、AIdegen Android Studio 查看源码4.1 准备工作4.2 Android Studio 配置4.2.1 添加源码中的 jdk 和 sd…

两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。…

arcgis实现影像监督分类

1、打开ArcMap,右击空白处打开影像分类工具栏&#xff0c;如下&#xff1a; 2、打开影像&#xff0c;如下&#xff1a; 打开的影像由于未经处理&#xff0c;颜色看起来很昏暗&#xff0c;这时候可以拉伸一下。具体操作&#xff0c;右击图层选择属性&#xff0c;如下&#xff1a…

python使用websockets进行数据传输

背景说明&#xff1a; 最近在研究一个智能监控系统&#xff0c;后台通过rtsp读取摄像头视频流&#xff0c;使用yolov算法进行目标检测&#xff0c;然后将检测的视频帧通过字符串的方式抛转到前台html页面显示&#xff0c;需要用到前后台数据交互技术&#xff0c;查询资料发现w…

ShareX设置快捷键、自定义保存路径、取消上传等设置

让ShareX变成顺手的形状 设置篇ShareX设置快捷键ShareX设置自定义保存路径ShareX取消自动上传和打开OCR 使用篇OCR 设置篇 ShareX设置快捷键 ShareX设置自定义保存路径 ShareX取消自动上传和打开OCR 为什么取消上传功能&#xff1a;因为不需要自动把本地截图自动上传到远程服务…

Vue3 使用存储库Pinia(getters)

一、store.js创建getters import { defineStore } from "pinia"; export const useStore defineStore(main, {state() { // state表示这个store里的状态&#xff0c;也就是存放数据的地方return {name: 张三,age:26 }},actions: { // 和vue中的methods一样updateA…

前端必会的三种DIV+CSS布局

要开发网页&#xff0c;必须要搞懂这三种divcss布局技术&#xff01;&#xff08;1&#xff09;左右两列布局&#xff1b;&#xff08;2&#xff09;1行3列&#xff1b;&#xff08;3&#xff09;1行多列或多行多列布局&#xff1b;只要你掌握了这三种布局方式&#xff0c;那搭…

2核4G服务器腾讯云或阿里云能安装几个网站?性能如何?

2核4G服务器能安装多少个网站&#xff1f;2核4g配置能承载多少个网站&#xff1f;一台2核4G服务器可以安装多少个网站&#xff1f;阿腾云2核4G5M带宽服务器目前安装了14个网站&#xff0c;从技术角度是没有限制的&#xff0c;只要云服务器性能够用&#xff0c;想安装几个网站就…

java之maven专题

1、idea配置maven https://blog.csdn.net/hanmingjun/article/details/129977880 2、阿里云补充缺少的jar包 到官方下载好jar包到这里上传 maven中配置跳过单元测试 https://maven.apache.org/surefire/maven-surefire-plugin/examples/skipping-tests.html

记录--再也不用手动改package.json的版本号

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本文的起因是有在代码仓库发包后&#xff0c;同事问我“为什么package.json 里的版本还是原来的&#xff0c;有没有更新&#xff1f;”&#xff0c;这个时候我意识到&#xff0c;我们完全没有必要在每…

lwip-2.1.3自带的httpd网页服务器使用教程(二)使用SSI动态生成网页部分内容

上一篇&#xff1a;lwip-2.1.3自带的httpd网页服务器使用教程&#xff08;一&#xff09;从SD卡读取网页文件并显示 通过全局数组定义TAG标签列表 &#xff08;本节例程名称&#xff1a;ssi_test&#xff09; 电脑上用的Web服务器采用ASP、PHP或JSP动态网页技术后&#xff0c…

Verdi之状态机状态查询nState

目录 5. nState 5.1如何打开状态机视图 5.2 如何在状态机视图中添加状态转移条件 5.3 如何查看状态机个状态对应的相关代码 5.4 查看具体的状态机状态转移时间点 5.5 查找自定义状态 5.6 查找某个状态执行的次数 5. nState 5.1如何打开状态机视图 1. 将设计文件导入Ver…

人脸识别学习

1、人脸识别如何做到一次学习 &#xff08;1&#xff09;、数据收集&#xff1a;收集包含多个人脸图像的数据集&#xff0c;每个人脸图像都有对应的标签或身份信息。 &#xff08;2&#xff09;、图像预处理&#xff1a;对数据集中的每个人脸图像进行预处理&#xff0c;包括图…

pytorch的配置从此不在愁

anaconda配置 原视频的配置网站&#xff1a;Anaconda pytorch&#xff1a; 【从入门到进阶】PyTorch深度学习框架完结合集&#xff01;草履虫都能学会的计算机视觉实战&#xff08;PyTorch安装/深度学习实战/神经网络/人工智能&#xff09;_哔哩哔哩_bilibili 上面的视频 …

开放麒麟操作系统能打动嵌入式软件工程师吗?

国产操作系统大部分客户其实是toB的&#xff0c;内核以外的源码也是不开源的&#xff0c;比如麒麟系、统信UOS等&#xff0c;个人学习、小企业基本不会用。7月5日开放麒麟操作系统v1.0版正式发布&#xff0c;不同点是这个操作系统从内核到桌面系统源代码都是开源的&#xff0c;…

SpringCloud Alibaba——Nacos1.x配置中心长轮询机制

目录 一、Nacos1.x配置中心长轮询机制二、Nacos1.x配置中心长轮询机制流程图解 一、Nacos1.x配置中心长轮询机制 客户端会轮询向服务端发出一个长连接请求&#xff0c;这个长连接最多30s就会超时&#xff0c;服务端收到客户端的请求会先判断当前是否有配置更新&#xff0c;有则…