C++函数的参数传递
值传递
即将实参的值拷贝给形参,形参和实参是两个相互独立的对象,在函数体内对形参所做的所有操作都不会改变实参的值。
指针形参
将指针作为形参实质与值传递一样,即执行指针拷贝工作将实参(指针的值)赋给形参,拷贝后两个指针是不同的指针,但它们指向同一个对象,所以我们可以间接的访问它所指的对象并修改它,但在函数体内修改被赋值指针本身的值并不会改变实参(被传入指针的值)。
(ps:这块表达不是很好,大概意思是指针形参和值传递类似,在函数体内修改传入的指针的值并不会影响实参本身的值,因为两个指针是不同的指针)
下面是一个示例:
void reset(int *point)
{
*point = 10; // 改变point所指对象的值
point = 0; // 只改变了point的局部拷贝,实参的值并未改变
}
int n = 5;
reset(&n); // 改变n的值并非n的地址
cout << "n = " << n << endl; // 输出n = 10
传递引用参数
因为对于引用的操作实质上是对于作用在引用所引的对象上,所以我们可以将函数的形参设置为引用类型,通过使用引用形参,允许函数改变一个或者多个实参的值。同时,传递引用参数也比值传递效率要高,且方便修改实参的值。
// 使用引用参数重写reset函数
void reset(int &i)
{
i = 10;
}
int i = 4;
reset(i);
cout << "i = " << i << endl;
如果函数无需改变引用形参的值,将其声明为常量引用即可
数组形参
数组有两个特殊性质,一是不允许拷贝数组,二是使用数组时通常会将其转化为指针。因为数组会被转换为指针,所以我们为函数传递一个数组时,实际上传递的是指向数组首元素的指针。
void arrSize(const char str_arg[100])
{
cout << sizeof(str_arg) << endl;
}
int main()
{
char str[] = "Hello";
cout << sizeof(str) << endl; // 会输出6
arrSize(str); // 会输出4,因为传递的是指向数组首元素的指针
return 0;
}
我们可以将形参写成类似数组的形式:
void fun(const int*);
void fun(const int []);
void fun(const int [10]);
尽管表现形式不同,但上面三个数组是等价的,每一个函数参数都是const int*类型。如果我们传递给fun函数的是一个数组,则实参的值自动转换为指向数组首元素的指针,数组大小对函数调用没有影响