/********错误程序********/
void key(char *p)
{
 p="ac";
}

int main()
{
 char *p="d";
 cout<<p<<endl;
 key(p);
 cout<<p<<endl;
 delete p;
}
//该程序只输出 "d"
/***********************/

/*******正确程序*******/
void key(char *p)
{
 strcpy(p,"ac");
}

int main()
{
 char *p=new char[5];
 strcpy(p,"e");
 cout<<p<<endl;
 key(p);
 cout<<p<<endl;
 delete[] p;
}
先输出 "e",再输出"ac"
/**********************/

==================================
第一个程序:
char *p="d";//p指向常量字符串
 cout<<p<<endl;
 key(char *p) //试图改变p,语法无误,但逻辑不允许,故编译正确,运行错误。在程序编译的时候; void key(char *p)类似被解释成:void key(const char *p){p="ac";}

第二个程序:
char *p = new char[100];//p指向数组的首地址,内容可变
 strcpy(p, "d");//内容变为“d”
 cout<<p<<endl;
 key(p);//内容变为“ac”,strcpy()不改变它的地址,只改变p所指的数组的内容,故输出为ac
C风格字串不支持直接赋值,要使用strcpy()。