您的位置:首页 > 其它

关于字符串指针不可修改的问题

2015-10-02 23:26 211 查看
C/C++ code

char*m ="hello";
*(m+1) ='s';
for(;*m !='\0';m++)
{
printf("%c\n",*m);
}


但是出运行时错误。

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

我用数组下标的方式是可以修改的:

C/C++ code
int i =0;

char w[] ="hello";

w[1] ='s';

while(w[i] !='\0')

{

printf("%c\n",w[i]);

i++;

}


答复一:

char *m = "hello";

"hello"保存在静态数据区,该数据不能修改.

由指针m指向. 不能通过指针m来修改静态数据区的值.

char w[] = "hello";

"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.

可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.

疑问:

这种说法是错误的。如下:

static int a = 10;
int *b = &a;
*b = 20;
cout<<a<<endl;

输出结果为20.我们依然通过指针修改了存储在静态存储区里的数据源。

//---------------------------------------------------

答复二:

字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!

回复三:

char *m = "hello";

"hello"保存在文字常量区,该数据不能修改,默认有只读属性.

由指针m指向. 不能通过指针m来修改此值.

char w[] = "hello";

"hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.

可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.

转自:/article/4894154.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: