鱼C论坛

 找回密码
 立即注册
查看: 1390|回复: 9

[已解决]char const *p 的问题

[复制链接]
发表于 2016-11-23 18:58:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
int  main()
{
        const char i = ‘i;
       
        char *const p = &i;
       
        *p = 'A';

        printf("%c ",*p);

        return 0;
}
                输出的是   'A'

我就是想问一下   这里我定义了一个常量的字符i,为什么可以用指针来改变呢???
最佳答案
2016-11-26 17:23:59
因為你用的是有指針的C語言
int main()
{
        const char i = ‘i';   //反编译后,其地址跟一般变数是在同一个段中,可想而知不会有什么你修改其值会中断程序并告诉你,权限不够不能修改之类的。通常,你无法在只知道地址的情况下,在程序中改变其值,这个作用只是当透过i告诉编译器这个地址时,你要修改其值会报错

        char *const p = &i; //一个常量指针,必须给初值(对一个常量不给初值是自找麻烦),当你修改其指向的地址的值时,编译器不会阻止你啊,他还要智能判断前面你已经定义为常量的i是你现在p所指向的吗

       上述如果没有给常量指针 p给初值,在之后用 p=&i 会报错,没办法通过编译。
       必须用修改第一个常量的方法修改常量指针,
       int* q=&p;
       *q=&i;

      或正规没有警告的写法
      char** q=&p;
      *q=&i;

     结论是所有你定义出来的常量,都可用指针的方式修改。      




        *p = 'A';

        printf("%c ",*p);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-23 19:48:58 | 显示全部楼层
char const *p 表示的是p这个指针不能被改变,不能被赋值,不能指向其他的值
const char *p表示的才是p指向的内容不能被改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-23 20:23:40 | 显示全部楼层
本帖最后由 四十二 于 2016-11-23 20:51 编辑
倾天 发表于 2016-11-23 19:48
char const *p 表示的是p这个指针不能被改变,不能被赋值,不能指向其他的值
const char *p表示的才是p指 ...


这两个应该是没区别吧兄弟


Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。

char * const cp; ( * 读成 pointer to )
cp is a const pointer to char

const char * p;
p is a pointer to const char;

char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。


C++标准规定,const关键字放在类型或变量名之前等价的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-23 20:37:30 | 显示全部楼层
我来说一下
const char *p    修饰的是*p  不能赋值 可以修改指向的地址
cahr *const p    常指针  修饰的是p  只能复制  不能修改地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-23 20:55:03 | 显示全部楼层
本帖最后由 四十二 于 2016-11-23 20:56 编辑

其实我也不懂,不装逼了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-23 21:21:38 | 显示全部楼层
按我的理解
        const char i = ‘i';
       
        char *const p = &i;//这句不可能通过编译,你用的是什么编译器呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-26 13:39:20 | 显示全部楼层
仰望天上的光 发表于 2016-11-23 21:21
按我的理解
        const char i = ‘i';
       

GCC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-26 17:23:59 | 显示全部楼层    本楼为最佳答案   
因為你用的是有指針的C語言
int main()
{
        const char i = ‘i';   //反编译后,其地址跟一般变数是在同一个段中,可想而知不会有什么你修改其值会中断程序并告诉你,权限不够不能修改之类的。通常,你无法在只知道地址的情况下,在程序中改变其值,这个作用只是当透过i告诉编译器这个地址时,你要修改其值会报错

        char *const p = &i; //一个常量指针,必须给初值(对一个常量不给初值是自找麻烦),当你修改其指向的地址的值时,编译器不会阻止你啊,他还要智能判断前面你已经定义为常量的i是你现在p所指向的吗

       上述如果没有给常量指针 p给初值,在之后用 p=&i 会报错,没办法通过编译。
       必须用修改第一个常量的方法修改常量指针,
       int* q=&p;
       *q=&i;

      或正规没有警告的写法
      char** q=&p;
      *q=&i;

     结论是所有你定义出来的常量,都可用指针的方式修改。      




        *p = 'A';

        printf("%c ",*p);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-26 17:24:41 | 显示全部楼层
char const i = 'a';  //const 表示不能变量名来修改内容,但是呢可以通过地址来修改他的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-26 17:27:03 | 显示全部楼层
fc1735 发表于 2016-11-26 17:23
因為你用的是有指針的C語言
int main()
{

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 18:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表