揭露谭浩强的错误-证实不能用字符指针变量做实参
谭浩强 《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[]所表示的字符串是可以修改的。
所以,将实参改成数组型即可,至于形参,使用数组和字符指针都可以。