常量被存储在常量区,并且表示常量不能被修改
当我们在定义一个字符串时 正确的规范应该是
const char*str="hello"
;
它代表我们这个字符串常量不能被修改,但是你会发现如果str="world";
编译也是正确的,为什么可以被修改?而*(str+1)='w';
却不能被编译;
实际上"hello"这个字符串属于常量有自己的内存空间(也就是有单独的内存地址),所谓的不能被修改 ,实际上是不能修改此地址上的常量,所以类似
*(str+1)='w';
就不能被编译;//*(str+1)
仍在"world"这个字符的内存空间
同理 "world"这个字符串常量实际上是拥有一个新的地址空间,所以str="world";
并未修改字符串(原地址的值)
如
`const char*str="hello";//地址为 0x010ffc00 {0x00257b30 "hello"}
str="world"; //地址为 0x010ffc00 {0x00257b38 "world"}
而对于
指针常量 int* const a
常量指针const int* a
常量指针常量const int* const a
的区别
指针常量表示 此指针指向的对象(地址)不能被修改
int x = 10, y = 10;
int* const p1 = &x; //常量 p1的类型是 (int*)
*p1= 10; // correct 指针常量可以改变指向对象的值
p1 = &y; // Error! 指针常量不能更改指向对象(地址)
常量指针表示 此指针指向的对象的值不能修改
const int x = 10;
const int* p1;
p1 = &x; //指针 p1的类型是 (const int*)
*p1 = 15; // Error!(改变原来x地址上空间的值了)
常量指针常量表示 此指针指向的对象的值和指向的对象(地址)皆不能被修改
int x = 10, y = 10;
const int* const p1 = &x;
*p1= 10; //Error!
p1 = &y; // Error!