C++的参数传递分为两种:
一.传值方式(参数为整型,实型,字符型等)
这种传递方式不会改变传入变量的值。例如:
// 传值方式
#include<iostream>
using namespace std;
void swap(int a,int b){
int t;
t = a;
a = b;
b =t;
}
int main(){
int m,n;
cin>>m>>n;
cout<<"传值之前:"<<m<<" "<<n<<endl;
swap(m,n);
cout<<"传值之后:"<<m<<" "<<n<<endl;
return 0;
}
结果如下:
二.传地址
传地址又分三类:
1.参数为指针变量
// 参数为指针变量
#include<iostream>
using namespace std;void swap(int* m,int* n){
int t = *m;
*m = *n;
*n = t;
}int main(){
int a = 6;
int b = 5;
int* p1 = &a;
int* p2 = &b;
cout<<"修改之前:a = "<<a<<" b = "<<b<<endl;
swap(p1,p2);
cout<<"修改之后:a = "<<a<<" b = "<<b<<endl;
return 0;
}
但如果是以下代码无法实现修改a,b的值。
// 形参变化不影响实参?
#include<iostream>
using namespace std;
void swap(int* m,int * n){
int* t = m;
m = n;
n = t;
}
int main(){
int a = 6;
int b = 5;
int* p1 = &a;
int* p2 = &b;
cout<<"修改之前:" <<p1<<" "<<p2<<endl;
swap(p1,p2);
cout<<"修改之后:"<<p1<<" "<<p2<<endl;return 0;
}
这里有点类似上面的传值方式。因为函数形参其实是传过来的值的副本,可以理解为我复制了一份出来。这里不涉及a,b数值的交换,只是m,n地址的交换。函数结束后,p1指向的还是a,p2指向的还是b。a = 6,b = 5;
2.参数为引用类型
// 引用类型传参
#include<iostream>
using namespace std;void swap(int& m,int& n){
int t = m;
m = n;
n = t;
}int main(){
int a = 5;
int b = 6;
int &i = a;
int &j = b;
cout<<"修改之前:a = "<<a<<" b ="<<b<<endl;
swap(a,b);
//swap(i,j);
cout<<"修改之后:a = "<<a<<" b ="<<b<<endl;
}
引用类型相当于给定义的变量取别称,但是二者还是共同指向同一地址的变量。
3.参数为数组名
// 传地址方式 --数组名作参数
#include<iostream>
#include<cstring>
using namespace std;/*void sub(char b[]){
//strcpy(b,"World");
b[0] = 'W';
b[1] = 'o';
b[2] = 'r';
b[3] = 'l';
b[4] = 'd';
} */void sub(char *b){
strcpy(b,"World");
}int main(){
char a[10] = "Hello";
cout<<"传值之前:"<<a<<endl;
sub(&a[0]);
cout<<"传值之后:"<<a<<endl;
return 0;
}
/* strcpy函数源码
char* strcpy(char* dest, const char* src) {
char* original_dest = dest; // 保存原始指针,用于返回
// 逐个复制字符,直到遇到 '\0'
while ((*dest++ = *src++) != '\0') {
// 空循环体,所有工作在条件表达式中完成
}
return original_dest; // 返回目标字符串的起始地址
}
*/
这里我上课照着打代码时报错,于是我去网上查,要想改变a数值的值,需要用到strcpy函数,函数源码如上补充。