标题:常量好烦人
只看楼主
小牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:434
专家分:8
注 册:2006-10-1
得分:0 

各们大哥:
你们的写的小弟水平有限有点看不懂。

在程序中定义了一个字符指针变量P,
在编译阶段系统已为p分配空间。


对版主“你的错误在于没有给指针分配空间”不理解。

在程序运行过程中没有改变指针变量的值。
p[2]='x';的意思是引用p的值(p的值是个地址)后面的第2个地址空间。
然后将其赋值‘x’,p的值没有改变。


shuaiye“改变指针的内容等于改变字符串常量”不理解。

整个程序的意思是将字符串常量的首地址赋给指针变量p;
然后通过p引用该字符串常量元素的空间,从而改变该字体串
常量的值。这个程序在TC中运行是成功的。

请各位大哥解释清楚一点,以解小弟的烦恼。

小弟刚加入BBS不久,不知以前有过这个问题。请问版主:我可不
可以看到旧贴。怎么看到?




本店经营各类国际品牌运动鞋,板鞋,休闲鞋,有李宁,nike,匹克,阿迪达斯。
2006-10-03 15:48
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
得分:0 
好像可以用搜索,不过我想问一下baidu那篇帖子的名字叫什么啊!不知道名字不太好搜阿

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2006-10-03 16:43
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 
char *p;
p="abcd";
=============>相当于
char *p="abcd";

"abcd"存储在静态常量区域,指针p指向了这块内存的首地址,"abcd"内容不可以修改。

TC下可以修改那是TC的事,char *p="abcd"; 相当于 const char *p="abcd";

我的原则很简单:不做不喜欢的事!
2006-10-03 16:48
heamer_c
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2006-7-18
得分:0 
这里实际上是先开辟了一个数组然后数组首地址给*p,p[2]指的是以数组首地址开始的第三个字节,a b c d当然是常量没错但它们是属于数组的内容,内容当然你想改就改啊,a b c d是实在存在的啊,你用p[2]=x并没有使a b c d 的二进制值改变啊,你只是改变了内存中存放的内容啊,通俗一点就是你把字母c从内存里撵走了然后让x取代了它的位置,你还是没分清内存地址与内存内容的概念,可以说内存的每一个字节都是一个变量,你可以往里边放东西,我们平常所说的定义一个变量只是狭隘的理解,好久没看书了啊!真不知道说错了没有!

我就是程序,程序就是我,我还能退出程序吗?!
2006-10-03 17:05
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
得分:0 
楼上的真是高手高手高高手。。。狂汗。。。

你已经犯了本质性错误了。。。建议去看一下TCPL。。。

我的原则很简单:不做不喜欢的事!
2006-10-03 18:25
小牛
Rank: 1
等 级:新手上路
威 望:1
帖 子:434
专家分:8
注 册:2006-10-1
得分:0 

晕了!对常量的理解究竟应该是怎样的?

难到二进制值没有改变的值就是常量。
如果这样的话,变量也是常量:


因为你虽然改变量的内容,但原来内
容的二进制值并没有改变呀!


本店经营各类国际品牌运动鞋,板鞋,休闲鞋,有李宁,nike,匹克,阿迪达斯。
2006-10-03 19:15
shuaiye
Rank: 1
等 级:新手上路
帖 子:445
专家分:0
注 册:2006-5-15
得分:0 

常量和变量都有自己的空间和自己的地址。说简单点:假设0000~~AAAA这段地址区域的空间是分配给常量的,那么在你定

义常量后,常量就存在这片区域中,而且这片区域是不允许在被其他数据替换的,除非程序停止,将空间自动释放。

我们在假设bbbb~~~cccc这片区域是分配给变量的,那么你定义变量后,变量就存在于这片区域中,但是这片区域是允许你

对它进行替换等操作的。在C语言中,你定义一个指针,而且让这个指针指向了一个变量或常量,也就相当于指向了一片区

域,指针名也就成了这片区域的代名词。


由于工作,N久都没来了!
2006-10-03 19:58
unicorn
Rank: 4
等 级:贵宾
威 望:14
帖 子:1066
专家分:0
注 册:2005-10-25
得分:0 

你的问题估计是编译器给你造成的困扰

在C语言中字符串常量是按照字符数组来来处理的

char *p;
p="abcd";
p[2]='x';

等价于
char a[]="abcd",*p;
p=a;
p[2]='x';

而在vc编译器的环境里字符串常量和字符数组处理方式不同,常量位于静态数据区,内存地址固定不允许修改
所以下面的字符串常量在vc++编译器肯定不能通过,因为不允许修改常量的
char *p;
p="abcd";
p[2]='x';

而下面的就可以喽,字符数组是连续的内存空间,p指向的是字符数组的首地址,当然可以随意更改p所指向空间的内容了
char a[]="abcd",*p;
p=a;
p[2]='x';

所有说不同的环境下处理的方式也会不同的


unicorn-h.spaces. ◇◆ sava-scratch.spaces.  noh enol ! pue pu!w hw u! shemle aq ll!m noh 
2006-10-03 20:20
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
得分:0 
“已经改变了内存中存放的内容啊,通俗一点就是你把字母c从内存里撵走了然后让x取代了它的位置”

居然还说:
“p[2]=‘x’并没有使 c 的二进制值改变”???

c 的值已经被取代了! 其二进制值还不改变???

说这话的小弟,C语言是怎么学的?


(‘c’ 的二进制值是 1100011)
被改变为:
(‘x’ 的二进制值是 1111000)


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2006-10-03 23:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-94040-1-1.html




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

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