user-0 提问: C语言，关于字符串copy的问题，不是大神，一般人看不出来有问题。

回复:
user: user-0
content: 引用 10 楼 bear234 的回复:[quote=引用 9 楼 hwx342840456 的回复:] [quote=引用 8 楼 bear234 的回复:] c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了.... 我能说谭浩强的书上有这么一段话么？C语言对字符串常量是按字符数组处理的，在内存开辟了一个字符数组用来存放该字符串常量。也就是说,char *a="string"相当于指针a指向一个字符数组的首地址，而两个字符数组里面存的字符是可以交换的。也就是说*a=*b是可以进行操作的。你发给我的全英文，我没有看懂。PS：第一段代码是书上的例子。我时觉得应该没有问题，但是确实报错了。不知道是不是我的环境有问题。你如果有环境，你编译试试？直接看可能还真看不出来。[/quote]  我没有给你发英文啊～～ 早已听说谭浩强的书不怎么样，但也不会犯这种错误吧  我想你估计是看到它在介绍数组如何处理字符串的内容了吧 不过这段话的确很垃圾...... 如果实在觉得不好，就换成c primer plus去看  总之呢，如果你直接用指针指向一个引号引起来的字符串，那么是不能通过指针去改变这个字符串的，因为这个时候字符串是常量   有一些老的编译器的确可以通过你贴出来的这段代码～～但是这是严重的错误，如果你的编译器也能通过，那么你可以这样编译一下看看： char *a = "abc"; a[1] ='z'; //试图把a指向的字符串从abc变成azc  如果你的编译器能通过你贴出来的代码，那么这里也可以通过 printf("abc");//如果上面两句都通过了，那么这里就会显示出“azc”  这里可以看到，我们以为第三句会显示出abc，但是它却显示的是azc   这是因为，在编译器眼里，任何引号形式的字符串都是一个地址信息，a指向“abc”的地址，你通过a把第二个字符改了，而当编译器再碰到“abc”时，它还是会找这个字符串原来的地址----这个地址从来就没变过，所以就会显示出此时这个地址存放的字符串，即“azc” 这也就是为什么现在编译器都禁止你贴出来的代码，也就是为什么在写char *a = "abc"的时候，会强烈建议前面加上const[/quote]  果然，学习了。当字符串为常量时，确实不能通过指针来改变它。谢谢咯。

user: user-1
content: 指针指向的地方你要能写。

user: user-2
content: 引用 9 楼 hwx342840456 的回复:[quote=引用 8 楼 bear234 的回复:] c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了.... 我能说谭浩强的书上有这么一段话么？C语言对字符串常量是按字符数组处理的，在内存开辟了一个字符数组用来存放该字符串常量。也就是说,char *a="string"相当于指针a指向一个字符数组的首地址，而两个字符数组里面存的字符是可以交换的。也就是说*a=*b是可以进行操作的。你发给我的全英文，我没有看懂。PS：第一段代码是书上的例子。我时觉得应该没有问题，但是确实报错了。不知道是不是我的环境有问题。你如果有环境，你编译试试？直接看可能还真看不出来。[/quote] 谭浩强写那本书的时代，是DOS时代，DOS是实模式，问题暴露不出来

user: user-3
content: 引用 9 楼 hwx342840456 的回复:[quote=引用 8 楼 bear234 的回复:] c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了.... 我能说谭浩强的书上有这么一段话么？C语言对字符串常量是按字符数组处理的，在内存开辟了一个字符数组用来存放该字符串常量。也就是说,char *a="string"相当于指针a指向一个字符数组的首地址，而两个字符数组里面存的字符是可以交换的。也就是说*a=*b是可以进行操作的。你发给我的全英文，我没有看懂。PS：第一段代码是书上的例子。我时觉得应该没有问题，但是确实报错了。不知道是不是我的环境有问题。你如果有环境，你编译试试？直接看可能还真看不出来。[/quote]  我记得我三年前学c语言的时候，看的是c primer plus，上面在讲这部分的时候，就举出了我上面给你写的那三行代码的例子，我当时用的一个很垃圾的编译器，可以编译通过这三行代码，估计这个编译器也能通过你贴出来的代码........现在我用的是vs，你的代码报错了.......  换书吧哥们儿.....谭浩强的书最大的意义就是能让完全不懂计算机的人短时间内考过二级......想好好学就看c primer plus

user: user-3
content: 引用 9 楼 hwx342840456 的回复:[quote=引用 8 楼 bear234 的回复:] c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了.... 我能说谭浩强的书上有这么一段话么？C语言对字符串常量是按字符数组处理的，在内存开辟了一个字符数组用来存放该字符串常量。也就是说,char *a="string"相当于指针a指向一个字符数组的首地址，而两个字符数组里面存的字符是可以交换的。也就是说*a=*b是可以进行操作的。你发给我的全英文，我没有看懂。PS：第一段代码是书上的例子。我时觉得应该没有问题，但是确实报错了。不知道是不是我的环境有问题。你如果有环境，你编译试试？直接看可能还真看不出来。[/quote]  我没有给你发英文啊～～ 早已听说谭浩强的书不怎么样，但也不会犯这种错误吧  我想你估计是看到它在介绍数组如何处理字符串的内容了吧 不过这段话的确很垃圾...... 如果实在觉得不好，就换成c primer plus去看  总之呢，如果你直接用指针指向一个引号引起来的字符串，那么是不能通过指针去改变这个字符串的，因为这个时候字符串是常量   有一些老的编译器的确可以通过你贴出来的这段代码～～但是这是严重的错误，如果你的编译器也能通过，那么你可以这样编译一下看看： char *a = "abc"; a[1] ='z'; //试图把a指向的字符串从abc变成azc  如果你的编译器能通过你贴出来的代码，那么这里也可以通过 printf("abc");//如果上面两句都通过了，那么这里就会显示出“azc”  这里可以看到，我们以为第三句会显示出abc，但是它却显示的是azc   这是因为，在编译器眼里，任何引号形式的字符串都是一个地址信息，a指向“abc”的地址，你通过a把第二个字符改了，而当编译器再碰到“abc”时，它还是会找这个字符串原来的地址----这个地址从来就没变过，所以就会显示出此时这个地址存放的字符串，即“azc” 这也就是为什么现在编译器都禁止你贴出来的代码，也就是为什么在写char *a = "abc"的时候，会强烈建议前面加上const

user: user-0
content: 引用 8 楼 bear234 的回复:c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了.... 我能说谭浩强的书上有这么一段话么？C语言对字符串常量是按字符数组处理的，在内存开辟了一个字符数组用来存放该字符串常量。也就是说,char *a="string"相当于指针a指向一个字符数组的首地址，而两个字符数组里面存的字符是可以交换的。也就是说*a=*b是可以进行操作的。你发给我的全英文，我没有看懂。PS：第一段代码是书上的例子。我时觉得应该没有问题，但是确实报错了。不知道是不是我的环境有问题。你如果有环境，你编译试试？直接看可能还真看不出来。

user: user-3
content: c语言最基本的知识........需要大神才能看出来么？ 字符串存储在什么地方？ 为什么c primer plus说如果用char ×指向一个字符串，强烈建议前面加const？  你自己看不出来罢了....

user: user-4
content: http://stackoverflow.com/questions/12121759/difference-between-char-str-and-char-strn  自己看吧  第一种情况是在常量区 是不允许修改的 只读

user: user-5
content: 多看看字符串常量、字符数组方面的介绍……

user: user-0
content: 引用 4 楼 user-6 的回复:1：我指的常量是"string";这个字符串，这个字符串存储在常量区。 :2：char a[]="string";这里的a不是常量。 3：const char *a="string" 和char *const  a="string";的区别我估计你分别不出来。  1、我不明白； 2、char a[]=string 这里的a绝对是个常量，因为你开辟的是数组，一旦开辟数组，数组的首地址就是确定的，无法修改的； 3、const char *a应该是只a是个固定的char的指针类型，char *const a，应该是指a是固定的指针，不能修改。不知道这样理解对不对。

user: user-6
content: 1：我指的常量是"string";这个字符串，这个字符串存储在常量区。 :2：char a[]="string";这里的a不是常量。 3：const char *a="string" 和char *const  a="string";的区别我估计你分别不出来。

user: user-0
content: 引用 2 楼 user-6 的回复:不是大神也看出来了。 char *a="string";指针a指向字符串常量。个人觉得等价于const char *a="string";  我觉得不是你这么看的，char a[]="string";a才是常量。 char *a，a是指针变量，不是常量。不是大神，看不出来。哈哈

user: user-6
content: 不是大神也看出来了。 char *a="string";指针a指向字符串常量。个人觉得等价于const char *a="string";

user: user-0
content: 老规矩，沙发自己占。我顶。