const 和 volatile 组合考点
const int ( * ) 等价于 int const ( * )
const int x = 1 ; 说明 x 是常量,无法修改
如何区分指针常量和常量指针
指针常量 为 先有指针后有常量 故为 形式如 : int * const p = & x ; 且const 修饰的是 p ,p是一个指针,所以 对于 p ,无法再用 p = & y ; 进行重新赋值
常量指针 可以 理解为 指向常量的指针,只要指向常量就行,可以更换指向的对象, 形式如 : const int * p = & x; 由于指向的是 常量,所以 *p = 5; 这种操作是违法的
深入了解
看代码
int x = 1;const int* const y = &x;cout << *y << endl;cout << x << endl;x = 2;cout << *y << endl;cout << x << endl;
上面的代码是否正确,答案是 正确的,虽然无法通过 *y 来修改 x 的值,但是可以通过 直接修改 x 来改变
const , volatile , int 的任意组合 是等价的
学习指针
void* p;int a = 1;p = &a;cout << *p << endl;
上面的代码有什么问题
将整数变量 a 的地址赋值给一个 void* 指针 p。void* 是一种无类型指针,它可以存储任何类型的地址,但它本身没有类型信息。这就是问题所在,因为您在之后尝试通过 *p 来访问该地址,这实际上是一种类型不匹配的操作,可能会导致未定义行为或错误。
就算换做下面的代码
void* p;int a = 1;p = &a;*(int*)p = 2;cout << *p << endl;
也是错的,因为 p 本质还是 void * 类型的指针
要访问 a 的值,应该使用 int* 指针进行访问,如下所示:
void* p;int a = 1;p = &a;// 将 void* 指针转换为 int* 指针,然后访问值int* intPtr = static_cast(p);cout << *intPtr << endl;
这样,您可以正确地将 void* 指针转换为 int* 指针,然后访问 a 的值。在这个示例中,输出将为 1,因为 a 的值是 1。
引用