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;
}
本质: ** 引用的本质在 c++ 内部实现是一个指针常量 .** (指针常量 指正常量的 指向不可修改,指向的值可以修改)
#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. 语法:
-
引用: 引用的语法通常更简洁,不需要使用
*
运算符来访问数据。 -
指针: 指针的语法相对更复杂,需要使用
*
运算符来解引用指针