请各位帮帮忙看看这个程序哪里出错了啊?

时间:2022-09-05 21:14:32
copy string.

#include <stdio.h>
int main (void)
{
    char * a = {"I love China!"};
    char * b = {"I like china!"};
    while (* a++ = * b++); //调试到这里就中断了。疑惑就是不是说指针变量只可变吗?可为什么这里就不行了呢?
    *a = '\0';
    printf ("%s",a);
    getch ();

return 0;
}
为什么要把上面的改成:
#include <stdio.h>
int main (void)
{
    void copy (char *to,char *from) ;
    char * a = {"I love China!"};
    char * b = {"I like china!"};
    copy (a,b);
    printf ("%s",a);
    getch ();

return 0;
}
void copy (char * to,char * from)
{
    while (* to++ = * from++);
    *to = '\0';
}


15 个解决方案

#1


希望大家帮帮忙~
小弟感激不尽~

#2


常量指针不能改变,你应该是取某个位置的字符,如下
while (*(a++) = *(b++))

#3



#include <stdio.h>
int main (void)
{
  char  a[] = {"I love China!"};
  char  b[]= {"I like china!"};
  char *a1=a;
  char *b1=b;
  while (* a1++ = * b1++); //调试到这里就中断了。疑惑就是不是说指针变量只可变吗?可为什么这里就不行了呢?
  *a1 = '\0';
  printf ("%s",a);
  //getch ();

return 0;
}


#4



#include <stdio.h>
int main (void)
{
  char * a = "I love China!";
  a++;   //如果说是常量不能改变,那为什么这个又可以改变呢??
//这个同(while (* a++ = * b++);)的改变又有何区别呢?
  printf ("%s\n",a);
  getch ();
return 0;
}

#5


a++; ------>指针指向了"I love China!"的空格,是指针指向有了变化。
while (* a++ = * b++);是赋值,是试图改变 "I love China!"这个字符串常量。程序
报错。 

#6


指针a指向的字符串存储在常量区内,常量区内的值不能改变,所以试图对常量区的值进行赋值会导致错误
引用楼主 blueskycz 的回复:
copy string.

#include <stdio.h>
int main (void)
{
  char * a = {"I love China!"};
  char * b = {"I like china!"};
  while (* a++ = * b++); //调试到这里就中断了。疑惑就是不是说指针变量只可变吗?可为什么这里就不行了呢?
  *a = '\0'……

#7


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

#8


该回复于2011-04-22 15:39:58被版主删除

#9


他们说的对字符串是常量,内容应该是不能改变的,
*a++只是移动字符数组的指针的位置实在要改变用函数strpy()或使用两个数组char a[],b[]来储存再用你的方法试试

#10


引用 1 楼 blueskycz 的回复:
希望大家帮帮忙~
小弟感激不尽~


char *a={"I love china !"};这个a指针指向的是常量区,编译器应该是将a变成常量指针,a是不可变的。

下面copy函数 C函数是按值copy所以将a当参数传进去,其实传的是副本,类似于char*p=a;传进去的是p不是a;

但愿解释清楚了

#11


。。。。

貌似觉得你两个都不行
你确定你两个都行?

#12


引用 10 楼 aa_niaofang 的回复:
引用 1 楼 blueskycz 的回复:

希望大家帮帮忙~
小弟感激不尽~


char *a={"I love china !"};这个a指针指向的是常量区,编译器应该是将a变成常量指针,a是不可变的。

下面copy函数 C函数是按值copy所以将a当参数传进去,其实传的是副本,类似于char*p=a;传进去的是p不是a;

但愿解释清楚了


没看清楚 重说下 a指向的是常量区 常量区得内容是不能改变的 a是可以改变 a指的内容不能改变

#13


  额  我是新手,不过=不是赋值么?==才是测试等于,那么while(*a++=*b++)不是在一直循环吗?

#14


哦,原来如此啊,谢谢大家哈!
我还以为内容可变呢

#15


常量不能改变

#1


希望大家帮帮忙~
小弟感激不尽~

#2


常量指针不能改变,你应该是取某个位置的字符,如下
while (*(a++) = *(b++))

#3



#include <stdio.h>
int main (void)
{
  char  a[] = {"I love China!"};
  char  b[]= {"I like china!"};
  char *a1=a;
  char *b1=b;
  while (* a1++ = * b1++); //调试到这里就中断了。疑惑就是不是说指针变量只可变吗?可为什么这里就不行了呢?
  *a1 = '\0';
  printf ("%s",a);
  //getch ();

return 0;
}


#4



#include <stdio.h>
int main (void)
{
  char * a = "I love China!";
  a++;   //如果说是常量不能改变,那为什么这个又可以改变呢??
//这个同(while (* a++ = * b++);)的改变又有何区别呢?
  printf ("%s\n",a);
  getch ();
return 0;
}

#5


a++; ------>指针指向了"I love China!"的空格,是指针指向有了变化。
while (* a++ = * b++);是赋值,是试图改变 "I love China!"这个字符串常量。程序
报错。 

#6


指针a指向的字符串存储在常量区内,常量区内的值不能改变,所以试图对常量区的值进行赋值会导致错误
引用楼主 blueskycz 的回复:
copy string.

#include <stdio.h>
int main (void)
{
  char * a = {"I love China!"};
  char * b = {"I like china!"};
  while (* a++ = * b++); //调试到这里就中断了。疑惑就是不是说指针变量只可变吗?可为什么这里就不行了呢?
  *a = '\0'……

#7


VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

#8


该回复于2011-04-22 15:39:58被版主删除

#9


他们说的对字符串是常量,内容应该是不能改变的,
*a++只是移动字符数组的指针的位置实在要改变用函数strpy()或使用两个数组char a[],b[]来储存再用你的方法试试

#10


引用 1 楼 blueskycz 的回复:
希望大家帮帮忙~
小弟感激不尽~


char *a={"I love china !"};这个a指针指向的是常量区,编译器应该是将a变成常量指针,a是不可变的。

下面copy函数 C函数是按值copy所以将a当参数传进去,其实传的是副本,类似于char*p=a;传进去的是p不是a;

但愿解释清楚了

#11


。。。。

貌似觉得你两个都不行
你确定你两个都行?

#12


引用 10 楼 aa_niaofang 的回复:
引用 1 楼 blueskycz 的回复:

希望大家帮帮忙~
小弟感激不尽~


char *a={"I love china !"};这个a指针指向的是常量区,编译器应该是将a变成常量指针,a是不可变的。

下面copy函数 C函数是按值copy所以将a当参数传进去,其实传的是副本,类似于char*p=a;传进去的是p不是a;

但愿解释清楚了


没看清楚 重说下 a指向的是常量区 常量区得内容是不能改变的 a是可以改变 a指的内容不能改变

#13


  额  我是新手,不过=不是赋值么?==才是测试等于,那么while(*a++=*b++)不是在一直循环吗?

#14


哦,原来如此啊,谢谢大家哈!
我还以为内容可变呢

#15


常量不能改变