注册 登录
编程论坛 C++教室

为什么常量也可以修改

vfdff 发布于 2008-10-15 12:43, 2764 次点击
const int ii = 3;
    int *pi = (int *)ⅈ
    *pi = 4;
    printf("%d\n",*pi);
输出的值是 4 而非3
怎么 常量也可以修改 吗??
26 回复
#2
asd67918682008-10-15 14:20
?????
你 并没有修改常量啊
#3
永夜的极光2008-10-15 16:10
用const定义的,应该叫"只读变量",只是禁止直接修改,通过你的方法,就可以实现修改
#4
asd67918682008-10-15 20:16
!!!!!!!!!!
const int ii = 3;
    int *pi = (int *)ⅈ
    *pi = 4;
    printf("%d\n",ii);


ii还是 等于3
#5
冰烨2008-10-15 20:38
const保护机制决定的。当你要获得const变量的地址时,会得到它的副本的地址,也不是真正const变量的地址
#6
kakaqq2008-10-15 20:51
你没修改ii,ii还是3。

这样估计不行了吧
我理解是将ii地址强制转换成了指针赋给了p。由此看出ii的地址其实没有变。我也不明白了p指向的是什么啊??
#7
冰烨2008-10-15 20:53
(1) C++中对const变量进行定义时必须初始化,否则仅仅是声明而已

(2) C++默认对const进行内联编译,C不是:const修饰的变量在C++中只在文件内部有效(内部联接),若要使它在其他文件中有效需要加上extern修饰。而在C中的const默认是extern的,因此不同文件中不允许有重名的const。

(3) C++通常情况不为const变量分配存储空间,而C中总要分配空间
#8
kakaqq2008-10-15 21:09
糊涂了。····这就是常变量?
#9
vfdff2008-10-15 22:37
回复 4# asd6791868 的帖子
我用VC编译得到4
不知道你使用什么??
#10
lockhawk2008-10-16 18:41
我同时cout<<*pi<<" "<<ii;
得到的结果是4,3
#11
newyj2008-10-16 20:20
赋给指针的是const的副本
也就是没有 改变 const的值 只是改变了 副本的值
#12
vfdff2008-10-16 23:52
确实如LS说的
赋给指针的是const的副本
也就是没有 改变 const的值,只是改变了副本的值
#13
中学者2008-10-17 12:29
改变副本???那它们为什么地址相同??
#14
blueboy820062008-10-17 12:40
长见识。。。
#15
冰烨2008-10-17 14:07
[bo][un]中学者[/un] 在 2008-10-17 12:29 的发言:[/bo]

改变副本???那它们为什么地址相同??


你只要想对const变量取址得到的便是它副本的地址。你说的它们地址相同,它们是“谁们呢”
#16
carekee2008-10-17 16:13
pi又不是常量
#17
youhm2008-10-17 16:41
但是*pi 并不等于 *(&ii),不知做何解释。
#18
sweetyhappy2008-10-17 17:38
当把ii定义为全局变量时,不输出任何
在主函数中定义ii时,输出为3
#19
中学者2008-10-17 19:11
回复 15# 冰烨 的帖子
我说的是pi的取值和ii的地址一样...我看了汇编~~~但是本人一直没学习-,- 所以没看出什么东西来~~惭愧....
#20
vfdff2008-10-21 15:20
反汇编
结果:

怎么连 pi 变量也没有分配空间,直接使用了 push ?

[[it] 本帖最后由 vfdff 于 2008-10-21 15:21 编辑 [/it]]
#21
newyj2008-10-21 20:17
要是把const 当做define的 用法来用的话(就是只是 定义个常量的话) 是不分配空间的
除非 是把const用在函数参数或返回类型时 才分配空间
#22
情结2008-10-22 19:49
ii的只是3,ii是没变的
你说的输出结果是4是因为*p所指向的 对象变为4,而不是ii变成了4
ii是3没变
#23
vfdff2008-10-25 16:09
回复 22# 情结 的帖子
但是p指向了 ii 的地址
为什么他们的值是不一样的呢?
#24
情结2008-10-25 17:44
回复 23# vfdff 的帖子
int *pi = (int *)&ii;
 *pi = 4;
首先pi是一个整形的指针,第一条是将pi指向ii,*pi 为3
第二条是将pi指向另外一个整形的对象4,ii与4是两个不同的整形对象;在内存中不是同一数据单元,*pi = 4;并不是将4赋值给ii,而是改变pi的指向
 int *pi = (int *)&ii;  cout<<ii<<*p<<endl;    //结果为3  3
 *pi = 4;   cout<<ii<<*p<<endl;    //结果为  3   4

[[it] 本帖最后由 情结 于 2008-10-25 17:46 编辑 [/it]]
#25
lockhawk2008-10-25 18:14
回复 24# 情结 的帖子
但是也很奇怪啊:为什么pi指向了4,但输出地址的时候pi和&ii是一样的。
#include<iostream.h>
int main()
{
    const int ii = 3;
    int *pi = (int *)&ii;
    *pi = 4;
    cout<<ii<<endl<<*pi<<endl<<&ii<<endl<<pi<<endl;
return 0;
}
#26
lyshyhuangli2008-10-26 21:55
不懂啊
#27
youhm2008-10-26 23:14
[bo][un]lockhawk[/un] 在 2008-10-25 18:14 的发言:[/bo]

但是也很奇怪啊:为什么pi指向了4,但输出地址的时候pi和&ii是一样的。
#include
int main()
{
    const int ii = 3;
    int *pi = (int *)&ii;
    *pi = 4;
    cout

实际上pi的指向并没有变,好像是初始的时候给常量ii分配了一个副本空间,这个空间可以被修改,但涉及到读取ii的数据时,并不是从这个副本读取,而是直接读出定义的常量值。
1