楼上说得对,但是不具体。
首先,指针中包含const关键字无外乎两种情况,第一种是指向常量的指针,如const char *pstr,也就是说指针指向的内存的内容不能变,但是指针本身可以变;第二种是常指针,如char *const str,也就是说指针本身不能变,指针总是指向同一块内存,但是指针指向的内容可以变。
第一种情况:char *p="123";
是将p指针指向了const字符串“123”;也就是说p是指向常量的指针,所以,*(++p)=‘k’出错,因为你在试图对常量重新赋值。
第二种情况:char c[]="hello";
这个是比较容易混淆的,因为其形式很像第一种,但其实有本质的区别。这里我们用字符串“hello”来初始化数组c,所以初始化后数组c中的内容是hello\0;但是在C语言中,以这种方式声明的数组名虽然表示着数组首地址,但却是const类型的,也就是说这个地址是常量,我们无法进行++c这样的自增操作,因为自增操作是要改变地址的。
最后,关于局部数组与全局说组的说法显然不成立,因为这是变量声明的位置决定的,往深入说就是作用域的问题。但有一点要非常注意,在有的编译器中,如果将char c1[]="hello";声明为全局变量;char c2[]="hello";也声明为全局变量,那么c2的首地址将紧紧着c1的末地址,他们在内存中存为"helloworld\0",这会使遍历c1的程序产生严重的错误,而且很不易发觉。所以最好不要这样申明,我们可以采用C++中的容器来实现这类无法确定大小的数组。
p不是常量指针,它只是指向了一个常量区域。
*(++p)运算本身是可以的,一个常量指针这个操作也是不可以的。
*(++p)=‘k’运算是不可以的,不能修改常量的内容。
const char* 指的是指针变量是常量,而不是指向的字符串是常量
如果指向字符串常量的常量指针变量的定义是
const char const *p
"123" 真要说的话 应该是 const char const *类型
所以他可以向指针变量赋值,但他的值不能修改
而 char c[] = "hello";是一个数组的初始化
编译后分成两步
第一步是申请 c[]的内存空间
第二步是将 (const char const*)("hello")的值复制到c[]的内存空间去
不知道你明白没有
总之 这是C定义是的一个误解
const char* 定义的是指针常量 而不是字符常量
在C中内存,可以划分为三种,堆、栈和静态存储区。
栈就是auto变量存放区域,自动释放,在编译时候需要知道空间大小。
堆一般用作开辟动态存储区,需要人工开辟,人工释放,可以在运行是开辟。比如说c中的malloc和free函数,还有C++中的new和delete。
还有就是静态存储区,这个区域存放一些常量,不能改变值。
char *p="123";意思是在静态存储区放入“123”,然后在栈中开辟一个指针p,指向“123”,也就是说指针p在栈中,“123”在静态存储区。所以能改变p指向,但是不能改变其指向的值。 即*(++p)='k',是错误的。
char c[]="hello";是在栈中分配空间,把“hello”存放在里面.