指针和引用的关键区别在于,指针是一个变量,存储的是一个地址,引用只是变量的一个别名。

# 详细区别

  1. 指针是存储变量地址的变量;引用是变量的别名。
  2. 指针变量定义时不必初始化;引用定义时必须初始化,不然会报错。
  3. 指针变量定义时可以初始化为 NULL;引用不能初始化为 NULL,不然报错。
  4. const 修饰指针变量,const 放在之前,指针变量所指向变量的值不可改变,指针值可以改变;const 放在之后,指针变量所指向变量的值可以改变,指针值不可以改变;const 修饰引用,const 放在之前,不能修改引用所表示的变量的值;const 放在之后,const 的作用被忽略,可以修改引用所表示的变量的值。
  5. 非常量指针在指针赋值后可以改变指针值;引用在初始化后不能再作为别的变量的别名。
  6. sizeof 运算符作用于指针变量得到指针变量自身大小;作用于引用,得到引用所指向的变量的大小。
  7. 指针可以有多级,引用只有一级。
  8. 指针的自增、自减表示指向下一个同类型变量的地址,一般用于指向数组的指针;引用的自增、自减表示指向变量值的增、减。

# 代码示例

#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