揭露谭浩强的错误-证实不能用字符指针变量做实参

谭浩强  《C程序设计第三版》 第255页 例10.19 有如下程序:

功能是将a字符串复制到b,并输出两个字符串。

#include<stdlib.h>
#include<stdio.h>
void copy_string(char *from,char *to)
{
  for(;*from!='\0';)
      *to++=*from++; 
   *to='\0'; 
}
int main()
{
char *a="I am teacher.";
char *b="you are a student.";
printf("string a=%s\nstring b=%s\n",a,b);
copy_string(a,b);
printf("\nstring a=%s\nstring b=%s\n",a,b);
system("pause");
}

老先生说得信誓旦旦,并在第257页作了总结,说 实参可以为字符指针变量。

奈何调试没成功。发现原因如下:

char *a = "I am a teacher.";  
char *b = "You are a student.";
a,b保存的是常量数据区地址,a,b指向的内容不能被修改
所以你函数里面的赋值是不起作用的.
改成这样
char a[] = "I am a teacher.";  
char b[] = "You are a student.";
字符串传给字符数组,a,b保存的是栈区地址,这样传进函数就可以修改其内容了.

简单地说,char * 和char[]都可以用来表示字符串,但两者有很大的不同。

其中最主要的不同就是char *所表示的字符串,是不能修改的,而char[]所表示的字符串是可以修改的。

所以,将实参改成数组型即可,至于形参,使用数组和字符指针都可以。

posted on 2012-10-26 14:50  天涯古人  阅读(469)  评论(0编辑  收藏  举报

导航