C/C++数组和指针的问题!

来源:百度知道 编辑:UC知道 时间:2024/05/16 19:34:45
问下高手,数组和指针创建一个字符串有什么区别?比如:char a[] = “hello”;和char *p = “world”; 为什么我做a[0] = ‘X’;就可以,做p[0] = ‘X’; 就会出错误?看过句话不明白解释下“指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。”
都说的很有道理,不过个人比较赞同三楼说的。想再问问为什么分配的常量字符不能修改?分配在动态存储区和静态存储区有什么区别吗?还有动态存储区是不是就是堆区,静态存储区是栈区?

其实“hello”和“world”都是常量字符串,其存放单元都位于静态存储区。
定义char a[]="hello"实际是另外给a开辟了一个存储空间,并把字符串"hello"复制到a的存储空间,所以a的存储空间不在静态存储区,其元素的值可以改变,如a[0]='x'。
而定义char *p = “world”没有开辟新的存储空间,p直接指向“world”所在的静态存储区,所以其值是不可以改变的。

指针是指向这个变量在内存的地址如char *p = “world”,那么你的p就保存的是W这个字符在内存的地址..你p[0] = ‘X’; 这样赋值肯定会错误的..因为你赋值的是字符,而不是一个变量的地址..你只能这样char *p1="X";p=p1;

char a[] = “hello”这个不用多说了吧..这个是事实保存的是字符..而不是地址可以做a[0] = ‘X’;运算..

楼上正解

a[]是通过逐字符拷贝得到串值的,从常量字符串拷贝到a[]自己的空间,以后可以修改;
p只是指向常量字符串的指针,而常量字符串里面的字符是不能修改的。

楼上不对,不是指针类型的问题。
如:
char *p1 = a;
p1[0] = 'X'; 就完全正确。