const修饰指针有三种情况
1. const修饰指针 --- 常量指针
2. const修饰常量 --- 指针常量
3. const即修饰指针,又修饰常量
```c++
int main() {
int a = 10;
int b = 10;
//const修饰的是指针,常量指针,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
p1 = &b; //正确
//*p1 = 100; 报错
//const修饰的是常量,指针指针常量,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
//const既修饰指针又修饰常量
const int * const p3 = &a;
//p3 = &b; //错误
//*p3 = 100; //错误
system("pause");
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int a = 10;
int b = 20;
int &c = a;
cout << &c << endl;
cout << &a << endl;
int *const p = &a;
cout << p << endl;
system("pause");
return 0;
}
综上:
1. 数据类型:
-
引用: 引用是一个别名,它引用了另一个变量或对象。引用必须始终与其引用的对象具有相同的数据类型。在C++中,引用通常通过
&
操作符声明,如int &ref = original;
。 -
指针: 指针是一个包含内存地址的变量。指针可以指向任何数据类型,包括其他指针。在C/C++中,指针通过
*
操作符声明,如int *ptr = &value;
。
2. 内存操作:
-
引用: 引用在编译时被解析为其引用的对象的地址。在使用引用时,你不需要关心地址操作,因为它们是隐式的。
-
指针: 指针需要显式地使用地址操作符
&
和解引用操作符*
来访问或修改数据。这意味着你可以更灵活地操作内存,但也需要更多的谨慎,以防止悬挂指针等问题。
3. 安全性:
-
引用: 由于引用在创建后不能更改其引用的对象,因此引用相对较安全,不容易出现空引用错误。
-
指针: 指针可以在运行时重新分配到不同的内存地址,这可能导致悬挂指针、野指针等问题,因此需要更小心地处理指针,以确保内存安全。
4. 语法:
-
引用: 引用的语法通常更简洁,不需要使用
*
运算符来访问数据。 -
指针: 指针的语法相对更复杂,需要使用
*
运算符来解引用指针