C语言的函数问题(涉及字符指针)

#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);
    }

img