Warning: 自家学习专用__by Arthur
函数参数的使用
脑子里只有按值传递和按引用传递的概念,但并未深究,经从网上收集资料整理,以帮助记忆。
按值传递
传入的为实参的副本(可理解为“影分身术”),因此函数体内对形参的操作,对本体是没有没有影响的(虽然Naruto能够感知影分身),如:
void swap1(int, int); //函数声明,交换两个int的值
void swap1(int a, int b) //函数定义
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int p = 110;
int q = 119;
swap1(p, q);
std::cout << p << "," << q << std::endl;
return 0;
}
//结果:110 119
//a,b的值并未交换,传入的为“影分身”
按引用传递
要明白什么是引用,就是为一个对象起了一个别名,就像你的大名和乳名一样,不管别人喊哪一个名字,都是指本体,因此函数体内的对形参的改变时刻回影响到本体,如
void swap2(int&, int&); //函数声明
void swap2(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int p = 110;
int q = 119;
swap2(p, q);
std::cout << p << "," << q << std::endl;
return 0;
}
//结果:119, 110
指针作为函数参数--1
指针,意味着传入的是对象的地址,直接上代码区别:
void swap3(int*, int*);
void swap3(int* a, int* b)
{
int temp = *a; //解引用操作,获取对象的值,实际上还是对本体操作
*a = *b;
*b = temp;
}
int main()
{
int p = 110;
int q = 119;
swap3(&p, &q);
std::cout << p << "," << q << std::endl;
return 0;
}
//结果:119, 110
//还是交换了值,因为函数体内部实际上还是对本体进行操作
指针作为函数参数--2
函数体内部对对象地址进行操作,区别于Demo-3,如:
void swap4(int*, int*);
void swap4(int* a, int* b)
{
int *temp = a; //定义了一个指针对象,函数体体内对地址进行操作
a = b;
b = temp;
}
int main()
{
int p = 110;
int q = 119;
swap4(&p, &q);
std::cout << p << "," << q << std::endl;
return 0;
}
//结果:110, 119
//并没有交换地址,原因在于:在main函数体内定义了两个变量p和q,此时,p和q就是内存块(p->pBuffer-p,q->qBuffer)的别名,,里面的值分别为110和119,即使swap4函数想要通过地址p和q交换两个对象,内存块的名字没变,存储的值也没变,因此通过p和q并没有交换值。
数组作为函数参数
需要明白的是,数组名本身就是指一块内存的首地址,于指针的作用相当,如
int array[3] = {0} //定义并初始化一个3维数组,初始值为0;
int* pArr = array; //等价于:int* pArr = array[0]
void swap5(int array[]); //等价 void swap5(int* array);