C菜鸟,关于const的问题,请教一下
本帖最后由 weidu23 于 2014-11-08 16:35:42 编辑
我基础不太好,问题,忘勿喷 ;
------------------------
都说const后,char*就不能随意改变 ,就是说 const char * ch是不能随便改的,
可我却发现了一些情况,请教一下,忘解惑:
------------代码手写--------
-----
问题1 :
-----
const char * c_address =“sip:8086@hostAddress” ;
unsigned int c_index = 0 ;
{
while( *(c_address++) != '@' )
{
c_index ++ ;
}
}
// 此时打印c_address ;
这段代码里,while循环结束后,打印c_address,为 hostAddress ;而不是原本的sip:8086@hostAddress ,
这,为毛呢 ,不是说const的数据是不变的么?
------
问题2:
------
const char * c_address =“sip:8086@hostAddress” ;
unsigned int c_index = 0 ;
{
const char* tmp = c_address ;
while( *(tmp++) != '@' )
{
c_index ++ ;
}
tmp = NULL ;
}
char * c_desp = malloc(sizeof(char)*c_index) ;
{
char * tmp ;
tmp = c_desp ;
while (c_index > 0)
{
*tmp++ = *c_address++ ;
c_index -- ;
}
}
这代码,是上一个代码的改良版 。
这代码中,我打算c_desp获取c_address中‘@’字符前面的所有数据 ,
可问题是,我 malloc的空间,却大于 char*c_index 的大小?断点看到,c_desp中除了sip:8086外,还有点别的东西 !!!
我只能在结尾加上 *tmp++ = '\0' ; 才行。
为什么?我不懂 。
----------------------------
以上,是我的两个问题,望解惑 !谢谢
------解决思路----------------------const char * c_address =“sip:8086@hostAddress” ;
这是常亮化指针变量值,不能够直接操作 *c_address 对其进行改变,但其地址可以改变,即可以c_address++,指针同样会往后移,你第一个指针往后移动了,移到了@后,@前的当然打不出来了。
------解决思路----------------------数值却是没有变,可是指针指的地方却变了,你在通过指针来读数据当然不一样了啊
------解决思路----------------------感觉这是“指向常量的指针变量”和“指针常量”的区别。
指向常量的指针变量(pc是一个变量):
const char * pc ;
指向常量的指针常量(pc是一个常量):
const char * const pc ;
------解决思路----------------------关于问题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 是一样的~ 参考见上
=> 希望的回答能对你的问题起到一定的帮助作用
------解决思路----------------------指针不能变和指针指向的东西不能变是两回事。
------解决思路----------------------常量指针和指针常量的问题。
常量指指向地址可变,内容不可变
指针常量地址不可变,内容可变
------解决思路----------------------const char *
和 char const * 是不一样的