char const *p 的问题
intmain(){
const char i = ‘i;
char *const p = &i;
*p = 'A';
printf("%c ",*p);
return 0;
}
输出的是 'A'
我就是想问一下 这里我定义了一个常量的字符i,为什么可以用指针来改变呢??? char const *p 表示的是p这个指针不能被改变,不能被赋值,不能指向其他的值
const char *p表示的才是p指向的内容不能被改变 本帖最后由 四十二 于 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关键字放在类型或变量名之前等价的。 我来说一下
const char *p 修饰的是*p不能赋值 可以修改指向的地址
cahr *const p 常指针修饰的是p只能复制不能修改地址 本帖最后由 四十二 于 2016-11-23 20:56 编辑
其实我也不懂,不装逼了 按我的理解
const char i = ‘i';
char *const p = &i;//这句不可能通过编译,你用的是什么编译器呢? 仰望天上的光 发表于 2016-11-23 21:21
按我的理解
const char i = ‘i';
GCC 因為你用的是有指針的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;
} char const i = 'a';//const 表示不能变量名来修改内容,但是呢可以通过地址来修改他的内容 fc1735 发表于 2016-11-26 17:23
因為你用的是有指針的C語言
int main()
{
{:9_228:}
页:
[1]