#include <stdio.h>
int main()
{
void change(char p[]);
char a[] = "I am a girl.";
change(a);
printf("%s\n", a);
return 0;
}
void change(char *p)
{
p = "I am a boy.";
*p = 'Y';
printf("%s\n", p);
}
以上代码是会报错的,因为倒数第三行有问题,为什么呢?如果删去倒数第四行,程序就能正常运行。那么倒数第三行和倒数第四行一起出现为什么会出现问题呢?在这个函数里,改变p的指向为“I am a boy.”,并利用这个"I am a boy "字符串,想把第一个字符'I'改为'Y'.
因为把一个字符串字面量,即如“I am a boy.”这样的字符串是const数据,不能用指向这个字符串字面量的指针来改变他。除非把这个字面量给一个数组做初始化赋值时才能进行改变数据。(参考:C Primer Plus第六版第324页)所以可以先用一个数组用这个字符串字面量"I am a boy."进行初始化赋值,再用p指针指向这个数组再进行改变是可以的,如下:
#include <stdio.h>
int main()
{
void change(char p[]);
char a[] = "I am a girl.";
change(a);
printf("%s\n", a);
return 0;
}
void change(char *p)
{
char str [20]= "I am a boy.";
p=str;
*p = 'Y';
printf("%s\n", p);
}