参考《C/C++程序员面试宝典》
引用与值传递
在C++中,函数的参数和返回值的传递方式有3中:引用传递、值传递和指针传递。
什么是值传递
值传递是指将要传递的值当做一个副本传递。值传递过程中,被调函数的形参作为被调函数的局部变量处理,在内存的堆栈中开辟空间以存放由主调函数存放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会更改主调函数的实参变量的值。
void func1(int x)
{
x = x + 10;
}
int n = 0;
func1(n);
count << "n = " << n << endl; //输出n = 0
值传递将要传递的值当做一个副本传递,在函数调用时,实参把它的值传递给对应的形参,方法执行中形参值的改变不影响实参。
引用与值传递的区别
引用传递传递的是引用对象的内存地址。在地址传递中,被调函数的形参也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被作为间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。所以,被调函数对相残做的任何改变都会影响主调函数中的实参变量。
void func2(int& x)
{
x = x + 10
}
int n = 0;
func2(n); // 引用传递
cout << "n = " << n << endl; // 输出 n = 10
值传递 传递的是一个值的副本。函数对形参的操作不会影响实参的值,而引用传递传递的是引用对象的内存地址,函数对形参的操作会影响实参的值,实参的值将会随着形参值的更改而同样进行改变
指针和引用的区别
指针和引用都是关于地址的概念,指针指向一块内存,它的内容是所指内存的地址。而应用是某块内存的别名。指针是作为一个真正的实体存在的。
指针能够毫无约束地操作内存中的任何东西,由于指针功能强大,所以导致它比较危险。
指针和引用的具体区别如下:
- 指针是一个实体,而引用仅是个别名;
- 引用使用时无需解引用(*),指针需要解引用;
- 引用只能在定义时被初始化一次,之后不可变;指针可变
- 引用没有const,指针有const;
- 引用不能为空,指针可以为空;
- sizeof对引用得到的是所指对象的大小,对指针是指针本身的大小;
- 指针和引用的自增(++)运算不一样;
- 程序为指针分配内存空间,引用则没有。