user-0 提问: 实现将字符串常量s2的值赋给字符串常量s1，让字符串s1输出字符串s2的值，为什么无法实现?

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 引用 6 楼 a1qwertyuiop1 的回复:下面这段代码输出结果为abc，为何这里字符串常量s1的值却可以修改为abc? 之前的代码却不可以? #include <stdio.h> #include"stdlib.h" main() {     char y[9];     char *s1="iya";     char *s2="abc";     int i=0;     for(;*s1;s1++,s2++,i++){       y[i]=*s2;     }      *s1='\0';     s1=&y[0];     printf("%s",s1);       system("pause"); } 你的这个程序改变的并不是"iya"，而是s1指针的内容，使s1指向了数组y。    从第3张图可以看到，保存字符串iya的地址0x01266b30中的内容并没有改变；改变的是s1的内容，s1指向的内容变为了abc。 在VS2015+Windows10 64位调试的过程中，你的代码还需要修改一下： 1将char y[9];改为char y[9]={0};即对数组y进行初始化，否则输出的s1有“烫”字； 2将 *s1='\0';注释掉，从第二张图可以看到，此时s1的值是0x01266b33，对该处内存地址赋值时不允许的，要报错。

user: user-2
content: 引用 10 楼 wenpinglaoyao 的回复:[quote=引用 1 楼 hou09tian 的回复:] VS2015+Windows10 64位调试得到如下信息  对于     for(;*s2;s1++,s2++){       s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.     }  此时s1的值是0x002a6b30；s2的值是0x002a6b34。第一次执行for循环内的执行语句，s1的值变为0x002a6b34；之后执行for循环的表达式语句，此时s1和s2的值都是0x002a6b35，第二次执行for循环内的执行语句，两个变量值都是0x002a6b35，实际上for循环内的执行语句并没有起作用，这两个变量始终都相等。最后s1和s2的值都是0x002a6b37，此时如果再赋值 *s1='\0'; 就会报错，因为0x002a6b37这个位置是不能赋值的（没有对这个内存地址进行声明） 而 s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址， 是正确的，就相当于  您好朋友，您回答里面的图片是怎么搞出来的，调试时visual studio给您做出来的？？[/quote] WPS里面的画图功能

user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-3
content: char*赋初值后是字符串常量，不可改！

user: user-4
content: 引用 1 楼 hou09tian 的回复:VS2015+Windows10 64位调试得到如下信息  对于     for(;*s2;s1++,s2++){       s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.     }  此时s1的值是0x002a6b30；s2的值是0x002a6b34。第一次执行for循环内的执行语句，s1的值变为0x002a6b34；之后执行for循环的表达式语句，此时s1和s2的值都是0x002a6b35，第二次执行for循环内的执行语句，两个变量值都是0x002a6b35，实际上for循环内的执行语句并没有起作用，这两个变量始终都相等。最后s1和s2的值都是0x002a6b37，此时如果再赋值 *s1='\0'; 就会报错，因为0x002a6b37这个位置是不能赋值的（没有对这个内存地址进行声明） 而 s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址， 是正确的，就相当于  您好朋友，您回答里面的图片是怎么搞出来的，调试时visual studio给您做出来的？？

user: user-5
content: s2一直++，指向一个空才停止下来，然后把s2赋给s1，s1当然没有值了。

user: user-6
content: s1, s2是指向只读数据段，那么就不能被修改。另外，赋值也是有问题，即使s1是可读可写的，那么赋值也不能是s1 = s2，而是 *s1 = s2; 代码如下： #include <stdio.h> #include"stdlib.h" int main() {     char y[9];     char *s1= y;     char *s2="abc";      for(;*s2;s1++,s2++){         *s1 = *s2;     }     *s1 = '\0';      printf("%s\n", y);     system("pause"); }

user: user-0
content: 下面这段代码输出结果为abc，为何这里字符串常量s1的值却可以修改为abc? 之前的代码却不可以? #include <stdio.h> #include"stdlib.h" main() {     char y[9];     char *s1="iya";     char *s2="abc";     int i=0;     for(;*s1;s1++,s2++,i++){       y[i]=*s2;     }      *s1='\0';     s1=&y[0];     printf("%s",s1);       system("pause"); }

user: user-0
content: 同样是字符串常量，为何这里字符串常量s1的值却可以修改？ #include <stdio.h> #include"stdlib.h" main() {     char y[9];     char *s1="iya";     char *s2="abc";     int i=0;     for(;*s1;s1++,s2++,i++){       y[i]=*s2;     }      *s1='\0';     s1=&y[0];     printf("%s",s1);       system("pause"); }

user: user-2
content: 引用 3 楼 a1qwertyuiop1 的回复:既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢？ "abc"、“iya”是字符串常量，是不能被修改的。

user: user-0
content: 既然s2各个字符地址已经传给了s1.为何没将值"abc"传过去呢？

user: user-2
content: 对于for循环语句的初始化语句、条件语句、表达式语句和执行语句的含义，请看 http://blog.csdn.net/hou09tian/article/details/77001685 我自己写的一篇关于for循环的小文章，请多指教

user: user-2
content: VS2015+Windows10 64位调试得到如下信息  对于     for(;*s2;s1++,s2++){       s1=s2;                         //这行将s2的地址赋给s1,是不是相当于将地址对应的值赋给s1,也就是实现*s1=*s2.     }  此时s1的值是0x002a6b30；s2的值是0x002a6b34。第一次执行for循环内的执行语句，s1的值变为0x002a6b34；之后执行for循环的表达式语句，此时s1和s2的值都是0x002a6b35，第二次执行for循环内的执行语句，两个变量值都是0x002a6b35，实际上for循环内的执行语句并没有起作用，这两个变量始终都相等。最后s1和s2的值都是0x002a6b37，此时如果再赋值 *s1='\0'; 就会报错，因为0x002a6b37这个位置是不能赋值的（没有对这个内存地址进行声明） 而 s1=&s2[0];                   //这行是不是相当于将指针s1指向s2的首地址， 是正确的，就相当于