一、指针和引用的区别
- 指针是一个变量,存储的是一个地址,引用指向原来的变量,是原先变量的别名。引用本身不会为变量开辟新的存储空间。
- 指针可以有多级,但是引用只能有一级
- 指针可以为空,但是引用不能为NULL且在定义的时候必须进行初始化
- 指针在初始化之后可以改变指向,而引用在初始化之后不能再改变指向,引用一旦初始化后就不能再改变
-
sizeof(一个指针)得到的本指针的大小,sizeof(一个引用)得到的是引用所指向的变量的大小。
-
当把指针作为参数进行传递的时候,也是将实参的一个**拷贝**传递给形参,两者指向的地址相同,但是不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以。
- 不存在指向空值的引用,即引用的指向必须存在具体的实体,但是存在指向空值的指针。
参考代码如下:
void test(int *p)
{
int a=1;
p=&a;
cout<<p<<" "<<*p<<endl;
}
int main(void)
{
int *p=NULL;
test(p);
if(p==NULL)
cout<<"指针p为NULL"<<endl;
return 0;
}
//运行结果为:
//0x22ff44 1
//指针p为NULL
void testPTR(int* p) {
int a = 12;
p = &a;
}
void testREFF(int& p) {
int a = 12;
p = a;
}
void main()
{
int a = 10;
int* b = &a;
testPTR(b);//改变指针指向,但是没改变指针的所指的内容
cout << a << endl;// 10
cout << *b << endl;// 10
a = 10;
testREFF(a);
cout << a << endl;//12
}
在编译器看来, int a = 10; int &b = a; 等价于 int * const b = &a; 而 b = 20; 等价于 *b = 20; 自动转换为指针和自动解引用.
二、在传递函数参数的时候,什么时候需要传递指针,什么时候需要传递引用
- 需要返回函数内局部变量的内存的时候用指针。使用指针传递参数需要先开辟内存,用完要释放指针,不然会内存泄漏。而返回局部变量的引用是没有意义的。
- 对栈空间大小比较敏感的场景(比如使用递归)要使用引用。使用引用传递的时候不需要创建临时变量,开销会更小。
- 类对象作为参数传递的时候使用引用,这是cpp类对象传递的标准方式。