指针和引用的关键区别在于,指针是一个变量,存储的是一个地址,引用只是变量的一个别名。
# 详细区别
- 指针是存储变量地址的变量;引用是变量的别名。
- 指针变量定义时不必初始化;引用定义时必须初始化,不然会报错。
- 指针变量定义时可以初始化为 NULL;引用不能初始化为 NULL,不然报错。
- const 修饰指针变量,const 放在之前,指针变量所指向变量的值不可改变,指针值可以改变;const 放在之后,指针变量所指向变量的值可以改变,指针值不可以改变;const 修饰引用,const 放在之前,不能修改引用所表示的变量的值;const 放在之后,const 的作用被忽略,可以修改引用所表示的变量的值。
- 非常量指针在指针赋值后可以改变指针值;引用在初始化后不能再作为别的变量的别名。
- sizeof 运算符作用于指针变量得到指针变量自身大小;作用于引用,得到引用所指向的变量的大小。
- 指针可以有多级,引用只有一级。
- 指针的自增、自减表示指向下一个同类型变量的地址,一般用于指向数组的指针;引用的自增、自减表示指向变量值的增、减。
# 代码示例
#include <iostream> | |
using namespace std; | |
class A { | |
public: | |
A() {} | |
A(int _a1):_a(_a1) {} | |
void add_a() { | |
_a++; | |
} | |
int get_a() { | |
return _a; | |
} | |
private: | |
int _a; | |
}; | |
void test1(int a) { | |
a++; | |
cout << "test int a: " << a << endl; | |
} | |
void test2(int* a) { | |
(*a)++; | |
cout << "test int* a: " << *a << endl; | |
} | |
void test3(A a) { | |
a.add_a(); | |
cout << "test A a: " << a.get_a() << endl; | |
} | |
void test4(A* a) { | |
a -> add_a(); | |
cout << "test A* a: " << a -> get_a() << endl; | |
} | |
void test5(A& a) { | |
a.add_a(); | |
cout << "test A& a: " << a.get_a() << endl; | |
} | |
int main() { | |
int a = 1; | |
int* b = &a; | |
cout << a << endl; | |
test1(a); | |
cout << a << endl; | |
test2(b); | |
cout << a << endl; | |
A aa(1); | |
A* bb = &aa; | |
cout << aa.get_a() << endl; | |
test3(aa); | |
cout << aa.get_a() << endl; | |
test4(bb); | |
cout << aa.get_a() << endl; | |
test5(aa); | |
cout << aa.get_a() << endl; | |
} |
输出结果:
1
test int a: 2
1
test int* a: 2
2
1
test A a: 2
1
test A* a: 2
2
test A& a: 3
3