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。

引用