1、值传递(实参和形参均为变量)
void changeVaule(int a)
{
a = 8;
}
int main()
{
int b = 1;
changeVaule(b);
cout << b <<endl;//输出结果为1
}
这种值传递方式,实参 b 传递给形参 a ,只是发生了该内存内容上的一个拷贝,所以不会改变原来的值。
2:引用传递(形参是一个引用)
void changeVaule(int &a)
{
a = 8;
}
int main()
{
int b = 1;
changeVaule(b);
cout << b <<endl;//输出结果为8
}
解释:此时形参变成了一个引用,也就是形参 a 变成了实参 b 的一个别名,用此方法可以改变实参原来的值,此方法进行参数传递效率比较高。
3:地址传递
(1)、指针(形参和实参均为指针)
void changeVaule(int *a)
{
*a = 8;
}
int main()
{
int b = 1;
changeVaule(&b);
cout << b <<endl;//输出结果为8
}
解释:实参将地址传递给了形参,两个元素共用一段内存(共用同一个地址),因此形参 a 的值发生改变,实参 b 的值也会发生改变。
(2)、数组(实参和形参均为数组)
void changeVaule(int a[5])
//void changeVaule(int a[])//也可以写成这样。因为形参数组大小可以不指定,即便指定了也可以与实参数组大小不一致,因为C编译器对形参数组大小不做检查,只是将实参数组的首地址传递给形参
{
a[3] = 1;
a[4] = 2;
}
int main()
{
int b[5] ={3,4,5,6,7};
changeVaule(b);
for(int i=0;i<5;i++)
{
cout << "i = " << i << " b["<<i<< "] = "<< b[i] << endl;//输出结果3,4,5,1,2
}
}
解释:这种传递方式其实和指针相似,都是地址传递,实参将数组 b[5] 首地址传递给了形参数组 a[5] ,这样两个数组就会占用一段内存,如果形参数组 a[5] 内容发生变化,那么实参数组内容也会发生变化。
(3)、形参指针,实参数组
void changeVaule(int *p)
{
*(p+2) = 888;//等价于改变数组的第3个元素
}
int main()
{
int b[5] ={3,4,5,6,7};
changeVaule(b);
for(int i=0;i<5;i++)
{
cout << "i = " << i << " b["<<i<< "] = "<< b[i] << endl;//输出结果3,4,888,6,7
}
}
解释:其实也没啥好解释的,只是换了一种写法。