举例:通过调用函数改变main函数里的变量的值
void foo(int m) { m = 8; } int main(int argc, char const* argv[]) { int n = 5; foo(n); return 0; }
可知,n的值不会被改变。
方法:使用指针
void foo(int* pN) { *pN = 8; } int main(int argc, char const* argv[]) { int n = 5; foo(&n); //取地址 return 0; }
但是使用指针可能会引发一些问题:
传指针时,必须要对指针的地址进行检查
void foo(int* pN) { *pN = 8; } int main(int argc, char const* argv[]) { int n = 5; foo(nullptr); cout << n << endl; return 0; }
编译器在编译时检测不出,在运行时才报错,当然可以通过检测空指针保证指针非空。
但是也无法保证函数执行到判断之后地址依然存在。
所以C++认为本质上就是想改变地址里的内容,只是地址的确定无法检测。干脆就不使用指针,引入引用
int n = 5; int& refN = n; refN = 6; cout << n << endl;
引用--变量的别名
... // void foo(int n) { n = 8; } //传入的参数也要是引用类型 void foo(int& n) { n = 8; } int main(int argc, char const* argv[]) { int n = 5; int& refN = n; foo(refN); cout << n << endl; return 0; }
引用的地址和n的地址相同,引用本身占据了4字节空间
引用的本质:
引用实质上是指针,
1)引用在定义的时候必须初始化,不能用常量为引用赋值
------定义时关联某个对象,并将对象的地址存放起来
2)只有常量引用可以使用常量来初始化
3)引用的关系一旦建立则无法修改
4)引用的使用:
--作为函数参数
--作为函数返回值
5)不存在二级引用,可以使用指针的引用来替代二级指针