| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2527 人关注过本帖
标题:const指针的赋值问题——新手入门,不理解
只看楼主 加入收藏
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
结帖率:83.33%
收藏
 问题点数:0 回复次数:9 
const指针的赋值问题——新手入门,不理解
书上说:“只能把非const指针赋给const指针,不能把const指针赋给非const指针”解释是防止你使用新指针改变const数据。为什么可以改变?
按照我的理解,首先声明a=5,然后将a赋给b(b=a;),那么应该是b改变为5,a不变;可对于(非const)=const;为什么却是(非const)不变,const变了???
求帮助!
2015-08-21 11:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你的書上沒解釋什麼叫const指針?

授人以渔,不授人以鱼。
2015-08-21 21:40
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
回复 2楼 TonyDeng
说用const声明后,就是只读的,不能写入
2015-08-22 07:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用天霁在2015-8-22 07:52:12的发言:

说用const声明后,就是只读的,不能写入


不是這樣的。仔細看書!你用的什麼書?

授人以渔,不授人以鱼。
2015-08-22 22:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
const指針,其實是有歧義的稱呼,因為有兩種const修飾法修飾指針,效果不同。

舉個例子:

int x = 1;
const int* p = &x;

這樣的形式,是指針p所指向的對象,被編譯器認為是祗讀的。也就是說,編譯器在編譯時,會認為這裡的指針p所指向的對象x,是不能修改的,但實際上x是否真的不能修改,卻是另一回事(你可以看到,在這個代碼中,x是int而非const int,所以它是可以修改的),編譯器祗負責不讓你寫出類似*p = 0這樣的賦值語句而已,你可以寫x = 0改變對象的值。衹有在聲明const int x = 1時,x才是祗讀的。

另一種修飾語法如下:
程序代码:
char s1[] = "Hello, world!";
char s2[] = "abcd";
char* const p = s1;
const char* q = s1;

這樣的形式,指針s才真的是祗讀的,此時指針的值不可改變,亦即它所指向的地址不可改變,但地址所放置的東西,卻仍然是可能改變的。這個代碼,指針s等於數組s1的入口地址,你在此後,無法寫出s = s2這樣的語句,也無法++p或p++,但是可以*p = 'h'把字符串s1的第一個字符改了。

指針q是上述第一種形式,此時可以++q或q++,寫出putchar(*q++)這樣的語句,輸出'H'之後q向前移動一個字符指向'e'。

對第一種形式,可以用另外一個指針修改對象,如下代碼:
程序代码:
int x = 1;
const int* p = &x;
int* q = &x;
*p = 0;        // 非法,編譯不通過
*q = 0;        // 合法,編譯通過並可執行成功

指針的一個陷阱,就是像這類用兩個不同的指針指向同一對象造成的。在大型、複雜的程序中,往往指針繁多,程序員自己也忘了到底有多少個指針指向同一個對象,會犯此指針修改了對象而彼指針不知道的錯誤,尤其是釋放堆申請內存的情況,問題更嚴重,假如指針p、q均指向同一塊堆內存,在某個函數調用了free(p),此後某個時刻,調用另一個函數卻使用了*q存取內存數據,那是致命的,根本沒有有效的解決方法——這就是C++引入智能指針的原因,C沒有。

[ 本帖最后由 TonyDeng 于 2015-8-22 23:03 编辑 ]

授人以渔,不授人以鱼。
2015-08-22 22:46
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
回复 4楼 TonyDeng
C Primer Plus
2015-08-23 09:32
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
回复 5楼 TonyDeng
(⊙o⊙)哦,非常感谢
2015-08-23 09:42
小K001
Rank: 2
等 级:论坛游民
帖 子:8
专家分:22
注 册:2015-8-26
收藏
得分:0 
您好,关于const 有三种。我拿常用的两种来说,比如对于char类型来说:const char *,这种写法旨在限定符合常量。比如char数组名就是const char。这也是为什么不能让一个数组名指向另一个数组名的原因。还有一种就是char * const,这种写法,不好意思。有点模糊了,你最好翻翻书吧。关于const在C++中用得比较多。推荐书目《C++ primer plus》
2015-08-26 09:04
b286951543
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-8-26
收藏
得分:0 
(首先声明a=5,然后将a赋给b(b=a;),那么应该是b改变为5,a不变;)不能把a赋给b,防止通过b来修改a(b是指针)
但是在两层间接运算时是不能把非const赋给const的,比如const int **p2; int *p1; 此时不允许p2=&p1
2015-08-26 12:31
快速回复:const指针的赋值问题——新手入门,不理解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045644 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved