MyException - 我的异常网
当前位置:我的异常网» C语言 » C初学者,关于const的有关问题,请问一下

C初学者,关于const的有关问题,请问一下

www.MyException.Cn  网友分享于:2014-11-20  浏览:0次
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 * 是不一样的

文章评论

2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Java程序员必看电影
Java程序员必看电影
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
10个调试和排错的小建议
10个调试和排错的小建议
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
一个程序员的时间管理
一个程序员的时间管理
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
编程语言是女人
编程语言是女人
我的丈夫是个程序员
我的丈夫是个程序员
鲜为人知的编程真相
鲜为人知的编程真相
代码女神横空出世
代码女神横空出世
程序员的鄙视链
程序员的鄙视链
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
每天工作4小时的程序员
每天工作4小时的程序员
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
如何成为一名黑客
如何成为一名黑客
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
总结2014中国互联网十大段子
总结2014中国互联网十大段子
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
老程序员的下场
老程序员的下场
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我是如何打败拖延症的
我是如何打败拖延症的
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员都该阅读的书
程序员都该阅读的书
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
 程序员的样子
程序员的样子
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
旅行,写作,编程
旅行,写作,编程
程序员必看的十大电影
程序员必看的十大电影
程序员和编码员之间的区别
程序员和编码员之间的区别
中美印日四国程序员比较
中美印日四国程序员比较
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有