请帮忙看看下面的指针赋值为什么会错解决方案

请帮忙看看下面的指针赋值为什么会错
char   *str1= "www.google.com ";
char   *pss=str;
i=strlen(str1);
for(j=0;j <i;j++)
{
if(*str1== '. ')
{
*str1= '@ ';//这里就死出来了
}
str1++;
}
printf( "str1:%s\n ",str1);

而且用: char   *str1= "www.google.com ";
char   *str2= ". ";
strtok(str1,str2);这里也会出错,
这两个错都是运行时直接死出来,请问错在哪呢?
                 
改成数组后就没问题
char   str1[]= "www.google.com ";
i=strlen(str1);
for(j=0;j <i;j++)
{
if(str1[j]== '. ')
{
str1[j]= '@ ';
}
}
printf( "str1:%s\n ",str1);

------解决方案--------------------
char *str1= "www.google.com ";
"www.google.com " 是静态常量。
你声明的指针是一个指向静态常量的指针。
------解决方案--------------------
char *str1= "www.google.com ";
是常量字符串,修改是非法的.

------解决方案--------------------
char *str1= "www.google.com ";

这只是定义了一个指向字符串的指针而已,这个指针它指向这个字符串的首地址,

而字符串是常量,在整个程序运行的过程中都是不可以修改的。

所以你这样:
*str1= '@ '
相当于对字字符串常量进行了修改,当然是不允许的

数组是可以修改的,所以改成数组之后运行正确
------解决方案--------------------
其实char *str1= "www.google.com ";

写成这样更明确:const char *str1= "www.google.com ";

也就是说,这个字符串是不可以被修改的常量