第一,这不是java语言。
第二,如果是C/C++语言,这是传引用。
函数的参数传递方式
传值方式
实参必须是常量、有确定值的变量或有确定值的表达式,而形参必须是变量。
函数调用时,给形参分配内存空间,将实参的值拷贝给形参,之后的函数执行中形参和实参就脱离了关系,谁都不影响谁。
实参与形参的数据类型应该一致,如果不一致,编译器将实参转换为所需类型,如果不能进行转换,将发生“类型不匹配”错误。
#include <iostream>
using std::cout;
using std::endl;
using std::ends;
void swap(int,int);
void main()
{
int a=15,b=8;
swap(a,b);
cout<<"a="<<a<<ends<<"b="<<b<<endl;//a=15 b=8
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
传址方式
情况一:对变量的操作
#include <iostream>
using std::cout;
using std::endl;
using std::ends;
void swap(int*,int*);
void main()
{
int a=15,b=8;
swap(&a,&b);
cout<<"a="<<a<<ends<<"b="<<b<<endl;//a=8 b=15
}
void swap(int*x,int*y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
情况二:以一维数组的形式处理一维数组
#include <iostream>
using std::cout;
using std::endl;
double average(double array[], int count);
int main(void)
{
double values[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
cout <<average(values, (sizeof values)/(sizeof values[0])) << endl;//5.5
return 0;
}
double average(double array[], int count)//形参表中数组名值可以被改变
{
double sum(0.0);
for(int i = 0; i < count; i++)
sum += array[i];// 可以改为sum += *array++;
return sum/count;
}
情况三:以指针形式处理一维数组
#include <iostream>
using std::cout;
using std::endl;
double average(double* array, int count);
int main(void)
{
double values[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 };
cout <<average(values, (sizeof values)/(sizeof values[0])) << endl;//5.5
return 0;
}
double average(double* array, int count)
{
double sum(0.0);
for(int i = 0; i < count; i++)
sum += *array++;
return sum/count;
}
情况四:处理多维数组
#include <iostream>
using std::cout;
using std::endl;
double yield(double beans[][4], int count);
double yield1(double beans[], int count);
int main(void)
{
double beans[3][4] =
{
{ 1.0,
2.0,
3.0,
4.0 },
{ 5.0,
6.0,
7.0,
8.0 },
{ 9.0, 10.0, 11.0, 12.0 }
};
cout <<yield(beans, sizeof beans/sizeof beans[0])<< endl;//78
cout<<yield1(&beans[0][0],sizeof beans/sizeof beans[0][0])<<endl;//78
return 0;
}
double yield(double beans[][4], int count)//以多维数组的形式处理多维数组
{
double sum(0.0);
for(int i = 0; i < count; i++)
for(int j = 0; j < 4; j++)
sum += beans[i][j];
return sum;
}
double yield1(double beans[], int count)//以一维数组的形式处理多维数组
{
double sum(0.0);
for(int i=0;i<count;i++)
sum+=beans[i];
return sum;
}
情况五:处理字符串
#include <iostream>
using namespace std;
void copy_string(char*from,char*to)
{
for(;*from!=’\0’;from++,to++)
*to=*from;
*to=’\0’;
}
void main()
{
char a[20]=”c language”;
char b[20]=”very good”;
copy_string(a,b);
cout<<a<<endl;
cout<<b<<endl;
}
传引用方式
例一:左值引用
#include <iostream>
using std::cout;
using std::endl;
using std::ends;
void swap(int&,int&);
void main()
{
int a=15,b=8;
swap(a,b);
cout<<"a="<<a<<ends<<"b="<<b<<endl;//a=8 b=15
}
void swap(int&x,int&y)
{
int temp;
temp=x;
x=y;
y=temp;
}
例二:右值引用
#include <iostream>
using std::cout;
using std::endl;
int incr10(int&& num);
int main(void)
{
int num=3,value=6;
cout<<incr10(value+num)<<endl;//19
cout << incr10(5)<<endl;//15
//incr10(num),incr10(value);//error
cout << endl;
return 0;
}
int incr10(int&& num)
{
num += 10;
return num;
}
将右值引用形参从左值转换为右值,使用std::move()库函数将一个左值转换为右值。