user-0 提问: 为什么指针字符串无法单个修改？

回复:
user: user-1
content: 引用 7 楼 Evankaka 的回复:字符串常量，它是放在静态区的，你改不了的 char *a=new char[10]; a="hello,c."; 然后再来改试试。 记得要delete  不懂就别误人子弟

user: user-2
content: 字符串常量不可改，当然，如果你硬要改那我也拿你没办法

user: user-3
content: 昨天刚看到这个问题  p 指向的是一个常量区, 是不能改变的, 即不能够对p[i]赋值, 而第二种情况下, p是一个字符数组, 其是可以改变的，可以对p[i]赋值的。 你可以看一下char *和char数组的区别

user: user-0
content: 引用 17 楼 ricciinhp 的回复:我觉得我说了很清楚了，虽然有些地方对于新手来说可能会产生误解 对自己的理解能力还是很自信的， 谢谢。

user: user-0
content: 引用 16 楼 ricciinhp 的回复:[quote=引用 14 楼 zerg73 的回复:] [quote=引用 13 楼 ricciinhp 的回复:] [quote=引用 11 楼 ricciinhp 的回复:] [quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 其实这么说也会有误导的嫌疑。问题的关键在于char* p是一个指针，它必须是内存中的一个地址，这样就必须把字符串放在内存中的某个位置，好让p指向这个字符串的首地址 至于为什么必须是放在只读数据区里面，我个人觉得这个要涉及到C语言的设计哲学。[/quote] 那我们就不讨论哲学，讨论为什么malloc之后 a="hello,c"; 和 a[0]='h';a[1]='e';a[2]='l';a[3]='l';a[4]=',';a[5]='c';a[6]='\0'; 之间的区别。 为啥前者就不能修改呢？后者可以修改，难道有区别？[/quote] 你malloc之后直接a="helloc,c"是不行的，必须要用strcpy函数拷贝过去 如果用a="helloc,c"，那么a又指向了只读数据区中的字符串，而且这样还造成了内存泄露[/quote] 原来是这样啊。。。。看来有必要写一个等号的重载了，主要strcpy不常用。搞懂问题真开心，可以结帖了

user: user-4
content: 我觉得我说了很清楚了，虽然有些地方对于新手来说可能会产生误解

user: user-4
content: 引用 14 楼 zerg73 的回复:[quote=引用 13 楼 ricciinhp 的回复:] [quote=引用 11 楼 ricciinhp 的回复:] [quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 其实这么说也会有误导的嫌疑。问题的关键在于char* p是一个指针，它必须是内存中的一个地址，这样就必须把字符串放在内存中的某个位置，好让p指向这个字符串的首地址 至于为什么必须是放在只读数据区里面，我个人觉得这个要涉及到C语言的设计哲学。[/quote] 那我们就不讨论哲学，讨论为什么malloc之后 a="hello,c"; 和 a[0]='h';a[1]='e';a[2]='l';a[3]='l';a[4]=',';a[5]='c';a[6]='\0'; 之间的区别。 为啥前者就不能修改呢？后者可以修改，难道有区别？[/quote] 你malloc之后直接a="helloc,c"是不行的，必须要用strcpy函数拷贝过去 如果用a="helloc,c"，那么a又指向了只读数据区中的字符串，而且这样还造成了内存泄露

user: user-4
content: 引用 13 楼 ricciinhp 的回复:[quote=引用 11 楼 ricciinhp 的回复:] [quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 其实这么说也会有误导的嫌疑。问题的关键在于char* p是一个指针，它必须是内存中的一个地址，这样就必须把字符串放在内存中的某个位置，好让p指向这个字符串的首地址 至于为什么必须是放在只读数据区里面，我个人觉得这个要涉及到C语言的设计哲学。[/quote] 也有可能是为了安全考虑

user: user-0
content: 引用 13 楼 ricciinhp 的回复:[quote=引用 11 楼 ricciinhp 的回复:] [quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 其实这么说也会有误导的嫌疑。问题的关键在于char* p是一个指针，它必须是内存中的一个地址，这样就必须把字符串放在内存中的某个位置，好让p指向这个字符串的首地址 至于为什么必须是放在只读数据区里面，我个人觉得这个要涉及到C语言的设计哲学。[/quote] 那我们就不讨论哲学，讨论为什么malloc之后 a="hello,c"; 和 a[0]='h';a[1]='e';a[2]='l';a[3]='l';a[4]=',';a[5]='c';a[6]='\0'; 之间的区别。 为啥前者就不能修改呢？后者可以修改，难道有区别？

user: user-4
content: 引用 11 楼 ricciinhp 的回复:[quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 其实这么说也会有误导的嫌疑。问题的关键在于char* p是一个指针，它必须是内存中的一个地址，这样就必须把字符串放在内存中的某个位置，好让p指向这个字符串的首地址 至于为什么必须是放在只读数据区里面，我个人觉得这个要涉及到C语言的设计哲学。

user: user-0
content: 引用 11 楼 ricciinhp 的回复:[quote=引用 5 楼 zerg73 的回复:] [quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了[/quote] 基本我搞懂我的问题问题出在哪儿了，就是指针a无法对静态数据进行操作，但是为什么我在使用了malloc之后还是不能修改呢？

user: user-4
content: 引用 5 楼 zerg73 的回复:[quote=引用 2 楼 ricciinhp 的回复:] 可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？[/quote] char*是一个指针吧，一个指针占多少个字节？4个，hello.c占几个字节？ 7个 那么编译器怎么让p = “hello.c”成功赋值呢，显然肯定不能直接在栈上初始化 这样编译器就把"hello.c"这个字符串放在整个程序的只读数据区里面，只让char* p取得这个字符串的首地址  而为什么a[] = "hello.c"可以改呢？那是因为a是一个数组，这样编译器就可以直接把那个字符串拷贝到栈上 于是你用a[0]='H'这样操作就能成功执行了

user: user-0
content: 引用 9 楼 Evankaka 的回复:[quote=引用 8 楼 zerg73 的回复:] [quote=引用 7 楼 Evankaka 的回复:] 字符串常量，它是放在静态区的，你改不了的 char *a=new char[10]; a="hello,c."; 然后再来改试试。 记得要delete 就是说new出来的是可以修改的，而C不行？[/quote] C不行？什么意思呢？char *a=“hello,c”。这里hello,c是字符串常量 ，会放在静态区，在整个程序运行时一直都存在，当程序关了后，它才想释放。然后如果是C语言用malloc/free来开辟堆安间[/quote] 刚才我试了一下，如果在malloc之后我写 a="hello,c"; a[0]='H'; 就回程序直接报错，但是如果从0开始单个给a赋值再修改就不会出问题，这又是为什么？

user: user-5
content: 引用 8 楼 zerg73 的回复:[quote=引用 7 楼 Evankaka 的回复:] 字符串常量，它是放在静态区的，你改不了的 char *a=new char[10]; a="hello,c."; 然后再来改试试。 记得要delete 就是说new出来的是可以修改的，而C不行？[/quote] C不行？什么意思呢？char *a=“hello,c”。这里hello,c是字符串常量 ，会放在静态区，在整个程序运行时一直都存在，当程序关了后，它才想释放。然后如果是C语言用malloc/free来开辟堆安间

user: user-0
content: 引用 7 楼 Evankaka 的回复:字符串常量，它是放在静态区的，你改不了的 char *a=new char[10]; a="hello,c."; 然后再来改试试。 记得要delete 就是说new出来的是可以修改的，而C不行？

user: user-5
content: 字符串常量，它是放在静态区的，你改不了的 char *a=new char[10]; a="hello,c."; 然后再来改试试。 记得要delete

user: user-0
content: 引用 4 楼 user-6 的回复: #include <stdio.h>  void main() { 	char a[] = "hello,c."; 	char *p ; 	p = a; 	p[0] = 'H'; 	printf("%s",p); }  谢谢，但是书上不是说数组和字符串指针的存储方式一样么，为什么a的类型换成指针就不行了呢？

user: user-0
content: 引用 2 楼 ricciinhp 的回复:可以做个变换，如下： int i = 1; 1 = 2; 你觉得编译器会让你通过吗，骚年？ 这俩不该是两个东西么，书上说指针是变量啊，你那个的第二句不该是i=2？

user: user-6
content: #include <stdio.h>  void main() { 	char a[] = "hello,c."; 	char *p ; 	p = a; 	p[0] = 'H'; 	printf("%s",p); }

user: user-0
content: 引用 1 楼 luo_miao 的回复:指针指向的是常量，不能修改。可以这样：  char a[64] = { 0 }; memcpy( a, "hello,c.", strlen("hello,c.") ); a[0] = 'H';  原来指针指向的是常量啊。。。。那么除此之外有别的修改方法吗请问？