c++各种函数传参(超级详细)

发布于:2023-01-09 ⋅ 阅读:(461) ⋅ 点赞:(0)

前言:作者一开始也不是很清楚函数传参的各种类型,(只会int),但后来发现这时远远不够的,所以下面给大家讲解一下各种类型的传参,包含指针,单反知道电脑是个啥的都能听懂

一.int类型:

#include<bits/stdc++.h>
using namespace std;
void c_out(int b){
	cout<<b;
}
int main(){
	int a=2;
	c_out(a);
	return 0;
}

首先先来看一段最简单的代码,这里创建了一个叫做c_out的函数,把一个int类型的变量a传给了函数,这里c_out(a)传入的是实参,void c_out(int a)是形参,也就是把a的值复制一份给函数,可以理解为 int b=a,因为这里是复制,所以再函数里面无论干什么,就算你大闹天宫,都不会影响main函数里的a的数值

#include<bits/stdc++.h>
using namespace std;
int a=2;
void c_out(){
	cout<<a<<endl;
	a=3;
	cout<<a;
}
int main(){
	c_out();
	return 0;
}

输出:2

这里的话 ,我们定义了一个全局变量,也就适用于c_out和main里面了,所以无论是c_out里还是main里修改变量a都是有效的

#include<bits/stdc++.h>
using namespace std;
void swap(int &a,int &b){
	int c=a;
	a=b;
	b=c;
}
int main(){
	int a=1,b=2;
	swap(a,b);
	cout<<a<<' '<<b;
	return 0;
}

输出:2 1 

这里为什么就把a和b的值换了呢?我们可以这么理解:这个传参可以理解为:

int &a=a;

int &b=b; 

我们可以这么理解。这个&的意思就是应用,比如说:

int a=1;
int &b=a;

意思是说b引用a,也就是说是这个变量a的别名,无论是对a操作还是对b操作都是一个意思,那么既然是这样,我们swap里引用呢a和b变量,那么在swap里操作和在main操作里是一个意思。

#include<bits/stdc++.h>
using namespace std;
void swap(int *a,int *b){
	int c=*a;
	*a=*b;
	*b=c;
}
int main(){
	int a=1,b=2;
	swap(&a,&b);
	cout<<a<<' '<<b;
	return 0;
}

输出:2 1  

这里为什么也把数的值给换了呢?

因为我们给进去的是指针,我们还是可以先把形参和实参这么理解:

int *a=&a;

int *b=&b; 

这里也就是定义了两个指针,并且分别指向a和b的地址,也就是把a和b的地址传进了swap函数里,因为我们知道计算机的内存里的地址存放的是变量的值,也可以理解为你的两个同学A和B,你都知道了他们家的地址,你就可以通过他们的地址找到他们。这里也一样,我们可以通过地址来改变他们的值。

这里我们通过再定义一个c来中转,这里说明一下,在swap函数里:

cout<<a;出来的是main里的a的地址

cout<<*a;出来的是main里a的值 

二.int类型的数组 

#include<bits/stdc++.h>
using namespace std;
void f(int a[],int b[]){
	cout<<a[0]<<' '<<b[0];
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(a,b);
	return 0;
}

输出:1 3 

这里我们向f函数里传入呢两个int类型的数组,这个就是标准的传入数组的方式,注意如果要把数组的长度传进去,要专门进行传入:

#include<bits/stdc++.h>
using namespace std;
void f(int a[],int b[],int lena,int lenb){
	cout<<a[0]<<' '<<b[0];
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(a,b,2,2);
	return 0;
}//正确
#include<bits/stdc++.h>
using namespace std;
void f(int a[],int b[]){
	cout<<a[0]<<' '<<b[0];
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(a[2],b[2]);
	return 0;
}//错误

那么数组可以用指针吗?答案是可以:

#include<bits/stdc++.h>
using namespace std;
void f(int *a,int *b){
	cout<<*a<<' '<<*b;
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(&a[0],&b[0]);
	return 0;
}

输出:1 3 

我们来分析一下:这里传进了数组a和b的首元素的地址,我们在f里接受了a和b的地址后,我们通过*将对应地址的值输出,这样是没问题的。

下面问大家一个问题,我们这样子传入,可以在f里使用如下代码吗:

cout<<*a[1];

cout<<*b[1];

答案是:不能

为什么呢?我们来分析一下:我们既然已经使用了指针,也就是地址,那么就要一直使用到底:

#include<bits/stdc++.h>
using namespace std;
void f(int *a,int *b){
	cout<<*(a+1)<<' '<<*(b+1);
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(&a[0],&b[0]);
	return 0;
}

输出:2 4 

这里的*(a+1)的意思就是在a的地址上加上一个int类型大小的值,因为我们知道数组是保存在连续的内存里的,那么这时候我们就定位到了a[1]这个值的地址,最后是用*来输出这个地址的值 

#include<bits/stdc++.h>
using namespace std;
void f(int &a,int &b){
	cout<<(a+1)<<' '<<(b+1);
}
int main(){
	int a[2]={1,2},b[2]={3,4};
	f(a[0],b[0]);
	return 0;
}

我们还有一种方式,就是引用,和上面的int类型的引用一样,不加赘述

三.char 

#include<bits/stdc++.h>
using namespace std;
void f(char a,char b){
	cout<<a<<b;
}
int main(){
	char a='a',b='b';
	f(a,b);
	return 0;
}

输出:ab 

不使用指针的情况下和int类型一样,传入形参。 

#include<bits/stdc++.h>
using namespace std;
void swap(char* a,char* b){
	char c=*a;
	*a=*b;
	*b=c;
}
int main(){
	char a='a',b='b';
	swap(&a,&b);
	cout<<a<<' '<<b;
	return 0;
}

输出:b a 

这里使用指针,也可以将a和b的值进行交换,和int类型一样

#include<bits/stdc++.h>
using namespace std;
void swap(char& a,char& b){
	char c=a;
	a=b;
	b=c;
}
int main(){
	char a='a',b='b';
	swap(a,b);
	cout<<a<<' '<<b;
	return 0;
}

输出:b a  

这个引用也是和int一毛一样 

三.字符串 

 不知道大家用的是c还是c++所以char[]和string都讲

1.char[]:

#include<bits/stdc++.h>
using namespace std;
void f(char a[]){
	cout<<a;
}
int main(){
	char a[]="abc";
	f(a);
	return 0;
}

输出:abc 

和int类型的数组也是一样的

接下来是指针:

#include<bits/stdc++.h>
using namespace std;
void f(char *a){
	cout<<*(a)<<*(a+1)<<*(a+2);
}
int main(){
	char a[]="abc";
	f(&a[0]);
	return 0;
}

接下来是引用:

#include<bits/stdc++.h>
using namespace std;
void f(char &a){
	cout<<(char)a<<(char)(a+1)<<(char)(a+2);
}
int main(){
	char a[]="abc";
	f(a[0]);
	return 0;
}

输出:abc 

注意这里要强制类型转换,要不然输出:

输出:a9899 

2.string 

#include<bits/stdc++.h>
using namespace std;
void f(string a){
	cout<<a[0];
}
int main(){
	string a;
	cin>>a;
	f(a);
	return 0;
}

一样也是最普通的传参

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到