user-0 提问: C菜鸟，关于const的问题，请教一下

回复:
user: user-1
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-2
content: 常量指针和指针常量的问题。  常量指指向地址可变，内容不可变 指针常量地址不可变，内容可变

user: user-3
content: const char * 和 char const * 是不一样的

user: user-0
content: 引用 1 楼 yuzhoufengjiu 的回复:const char * c_address =“sip:8086@hostAddress” ; 这是常亮化指针变量值，不能够直接操作  *c_address 对其进行改变，但其地址可以改变，即可以c_address++，指针同样会往后移，你第一个指针往后移动了，移到了@后，@前的当然打不出来了。  了解

user: user-0
content: 引用 5 楼 xiaowangwhl 的回复:感觉这是“指向常量的指针变量”和“指针常量”的区别。  指向常量的指针变量(pc是一个变量)： const char * pc ;  指向常量的指针常量(pc是一个常量)： const char * const pc ;  十分感谢

user: user-0
content: 引用 6 楼 u011573693 的回复:关于问题1：   const char * c_address  这句话分拆下是两部分const chat 和 (*c_address), (*c_address)是个指针，所以这句话的意思是告诉你c_address是指向const char类型的指针，因为是const也就意味着c_address指针指向的数据是不可改变的，这个写法类似 char const* c_address => 所以答案来了，这里c_address作为指针，其本身是可以改变，而不可改变的只是 c_address指向的数据，对于c_address++操作是完全被允许的，这样的操作改变的只是指针本身而不是指向的XXXX那个字符串。  而至于楼主说的，在c_address++后为什么输出是hostaddress而不是原来呢？ 这个是因为这个时候指针本身存储的地址改变了，但是原先的数据是没有变化的，例如下面图:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }     | ---- 最在c_address 指向的位置，也就是c_address其内部存储的地址为0XXXXX0  当你使用c_address++操作后，其实就是c_address自身存储的地址发生的改变，例如此时变成了0xxxxxx3,例如:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }                         | -----> 这个时候我c_address指向了这里，所以输出自然从这开始了   关于问题2，其实原理跟问题1 是一样的~ 参考见上  => 希望的回答能对你的问题起到一定的帮助作用  谢谢

user: user-4
content: 指针不能变和指针指向的东西不能变是两回事。

user: user-5
content: const char * c_address  这句话分拆下是两部分const chat 和 (*c_address), (*c_address)是个指针，所以这句话的意思是告诉你c_address是指向const char类型的指针，因为是const也就意味着c_address指针指向的数据是不可改变的，这个写法类似 char const* c_address => 所以答案来了，这里c_address作为指针，其本身是可以改变，而不可改变的只是 c_address指向的数据，对于c_address++操作是完全被允许的，这样的操作改变的只是指针本身而不是指向的XXXX那个字符串。  而至于楼主说的，在c_address++后为什么输出是hostaddress而不是原来呢？ 这个是因为这个时候指针本身存储的地址改变了，但是原先的数据是没有变化的，例如下面图:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }     | ---- 最在c_address 指向的位置，也就是c_address其内部存储的地址为0XXXXX0  当你使用c_address++操作后，其实就是c_address自身存储的地址发生的改变，例如此时变成了0xxxxxx3,例如:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }                         | -----> 这个时候我c_address指向了这里，所以输出自然从这开始了

user: user-5
content: 关于问题1：   const char * c_address  这句话分拆下是两部分const chat 和 (*c_address), (*c_address)是个指针，所以这句话的意思是告诉你c_address是指向const char类型的指针，因为是const也就意味着c_address指针指向的数据是不可改变的，这个写法类似 char const* c_address => 所以答案来了，这里c_address作为指针，其本身是可以改变，而不可改变的只是 c_address指向的数据，对于c_address++操作是完全被允许的，这样的操作改变的只是指针本身而不是指向的XXXX那个字符串。  而至于楼主说的，在c_address++后为什么输出是hostaddress而不是原来呢？ 这个是因为这个时候指针本身存储的地址改变了，但是原先的数据是没有变化的，例如下面图:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }     | ---- 最在c_address 指向的位置，也就是c_address其内部存储的地址为0XXXXX0  当你使用c_address++操作后，其实就是c_address自身存储的地址发生的改变，例如此时变成了0xxxxxx3,例如:  {  x | x | x | x | x | x | x | x | x | x | x | x | x | x }                         | -----> 这个时候我c_address指向了这里，所以输出自然从这开始了   关于问题2，其实原理跟问题1 是一样的~ 参考见上  => 希望的回答能对你的问题起到一定的帮助作用

user: user-6
content: 感觉这是“指向常量的指针变量”和“指针常量”的区别。  指向常量的指针变量(pc是一个变量)： const char * pc ;  指向常量的指针常量(pc是一个常量)： const char * const pc ;

user: user-7
content: 引用 2 楼 yuzhoufengjiu 的回复:char * c_desp = malloc(sizeof(char)*c_index) ;  malloc 函数返回值是一个void* 型的指针，你加一个强转看一下 char * c_desp = （char  *）malloc(sizeof(char)*c_index) ;+1

user: user-8
content: 数值却是没有变，可是指针指的地方却变了，你在通过指针来读数据当然不一样了啊

user: user-9
content: char * c_desp = malloc(sizeof(char)*c_index) ;  malloc 函数返回值是一个void* 型的指针，你加一个强转看一下 char * c_desp = （char  *）malloc(sizeof(char)*c_index) ;

user: user-9
content: const char * c_address =“sip:8086@hostAddress” ; 这是常亮化指针变量值，不能够直接操作  *c_address 对其进行改变，但其地址可以改变，即可以c_address++，指针同样会往后移，你第一个指针往后移动了，移到了@后，@前的当然打不出来了。