研究了下const 怎么感觉const char *p 跟char *p一样? 都可以修改!

fengkewei 2008-06-15 04:44:21

char text[20] ="fengkewei";

const char *p ; //不管是p指向的内容还是p本身 都可以改

//就算给

p =(char *)malloc(100);

p = text; //一样可以

感觉跟char *p 没区别;
****************************************************************
如果是char * const p

char text[20] ="fengkewei";
char text1[20] ="sldkfj";

char * const p = text; //必须初始化 否则出错

p = text1; //出错 本身内容不可以修改

strcpy(text, text1); //可以修改 但修改的只是text的内容 text的地址并没有改变

printf("%s\n", p);

****************************************************************************

char text[20] ="fengkewei";
char text1[20] ="sldkfj";

char * const p = (char *)malloc(100); //这样初始化也可以

strcpy(p, text1); //而且可以对其修改内容 因为修改的是堆的内容 并没有对p的内容(堆的地址)进行改变

printf("%s\n", p);

...全文
208 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2008-06-16
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
char a[] = "abcdefg";
const char *p = a;

*p = 'a';

return 0;
}

main.c:8: warning: assignment of read-only location
fengkewei 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuzl32 的回复:]
支持楼主的学习精神!

const char *p = "abcdcf"; //指针所指的内容不允许修改
[/Quote]

其实我觉得这里有双层的意思

一种是文字常量区 在内存上不允许修改

另一种就是const的限制 编译不让你通过 呵呵。。

感觉内存比编译器温柔


yuzl32 2008-06-15
  • 打赏
  • 举报
回复
支持楼主的学习精神!

const char *p = "abcdcf"; //指针所指的内容不允许修改
char* const p = "abcdcf"; //指针不允许修改
richbirdandy 2008-06-15
  • 打赏
  • 举报
回复
而限制 char const *p;可以这样声明
若要体现它的const特性 就只体现在p[0] = '%c'上了 (呵呵 这样不知道可以不) 可以说这种限制 是比较弱的?
==================================
区分下 const char* p ,char* const p, const char* const p
有个你想要的强的限制
ld_thinking 2008-06-15
  • 打赏
  • 举报
回复
其实花一天时间学习下《C和指针》里关于指针和字符串常量那几章,所有疑惑都可以得到解答

知识还是通过书本学习,掌握的才更加系统,深刻。
fengkewei 2008-06-15
  • 打赏
  • 举报
回复
弄明白了

这样是可以的。。。因为这样修改的是text



char text[20] ="fengkewei";
char text1[20] ="sldkfj";

char const *p; //不需要初始化
p = text; //p指向

text[0] = '1'; //p指向的内容可以修改
printf("%s\n", p);





然而这样是不可以的



char text[20] ="fengkewei";
char text1[20] ="sldkfj";

char const *p; //不需要初始化
p = text; //p指向

p[0] = '1'; //你不能通过已经限定过的char const *p 进行修改 注意这里出现的错误是编译错误 不是内存错误 也就是说 不是文字常量区的错误

printf("%s\n", p);









然而这样是不可以的 但const限制了text数组



const char text[20] ="fengkewei";
char const *p;
p = text;

p[0] = '1';

printf("%s\n", p);





也就是说 在VS2005下
限制:char * const p = ......; //声明必须初始化
而且不能对其p的值进行修改(也就是p里面保存的地址)
但你可以对p所指向的栈地址、堆地址、全局变量地址、静态变量地址的内容进行修改。文字常量区依然是不可修改的。。

而限制 char const *p;可以这样声明
若要体现它的const特性 就只体现在p[0] = '%c'上了 (呵呵 这样不知道可以不) 可以说这种限制 是比较弱的?

欢迎大家多讨论

ld_thinking 2008-06-15
  • 打赏
  • 举报
回复
p =(char *)malloc(100);

p = text; //一样可以


你这里只是把p指向text数组首地址,当然可以啊 有什么不对吗 ? 又不是声明的char * const
fengkewei 2008-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ld_thinking 的回复:]
char const * p = "test";

*p = 'a'; //错误,这样才体现出字符串常量不能被修改

----------------

[/Quote]


你这样声明 p是指向文字常量区的 就算不用const也不能改

不然我不会用数组的。。。
zzyjsjcom 2008-06-15
  • 打赏
  • 举报
回复
是编译器的问题
ld_thinking 2008-06-15
  • 打赏
  • 举报
回复
char const * p = "test";

*p = 'a'; //错误,这样才体现出字符串常量不能被修改

----------------

char text[20] ="fengkewei";

const char *p ; //不管是p指向的内容还是p本身 都可以改

//就算给

p =(char *)malloc(100);

p = text; //一样可以

而这里的p只是改变了其地址指向,并未改变p原始声明的字符串常量
fengkewei 2008-06-15
  • 打赏
  • 举报
回复
VS2005上 编译测试

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧