/*
int *const p : p 指针的指向不能改变;(此时理解为const修饰的是p指针)
int const* p / const int* p : p指向的地址空间的取值不能改变;(此时理解为const修饰的是p(理解为取值))
int const* const p : p指向的地址空间取值和指向都不能改变.
编译的时候,如果编译器识别到被const修改的变量a,有代码有修改a的取值,编译会报错; 但是程序运行时,并不关心是不是有const修饰变量,所以const只是一种编译检查代码语法规范的一个机制
被const修饰的变量,对变量地址的指针引用,可以间接的修改变量的取值
*/
#include <stdio.h>
#define CONST_P
#define CONST_STAR_P
int main(int argc, char* argv[])
{
int const a = 12345678;
//int const* const a = 12345678;
//这个才是终结者,a的取值不会被改变, a的指向也不能改变
//int *p = &a;//类型不匹配
#ifndef CONST_P
// 此时a的取值还是会被p0指针引用而改变
int *p0 = (int*)&a;
*p0 = 100;
#else
//此时,p1指针引用了a,虽然p1指针不能改变指向了,但是还是可以通过p1改变a的取值
int *const p1 = (int* const)&a;
*p1 = 100;
#if 0 //p1指针不可改变指向,不然编译报错
p1 = &b;
#endif
#endif
#ifdef CONST_STAR_P
//此时,即使p2指针引用了a,但是不能改变a的取值,因为const的修饰,p2指向的取值不能改变
int const* p2 = &a;
#if 0 //p2指针指向的内容不能改变,不然编译报错
*p2 = 100;
#endif
#endif
printf("a = %d\n", a);
return 0;
}