一个基础有关问题

一个基础问题
char   str[]= "asdf ";

char*   fun(char*   str)
{
        str++;
        return   str;
}
void   main()
{
        char*   str1=fun(str);
        printf( "%s ",str1);
        getch();
}

str[]是个数组,不能自加,但是传入函数fun()后,就可以自加了,我知道以char*   str这种格式是可以实现自加的,但是它实参是数组啊,这个到底是什么关系呢,形参是实参的拷贝,那么实参做的操作与形参作的操作不一样吗?头有点搞晕了,请哪位大虾解释下?

------解决方案--------------------
编译器总是要为函数的每个参数制作临时副本,指针参数str的副本是 _str,编译器使 _str = str。如果函数体内的程序修改了_str的内容,就导致参数str的内容作相应的修改。这就是指针可以用作输出参数的原因。

char str[]= "asdf ";
char* fun(char* str)
{
str++;//这里改变的是副本 _str的地址,而str的地址没有被改变
return str;
}
void main()
{
char* str1=fun(str);
printf( "%s\n ",str1);//输出sdf
printf( "%s\n ",str);//输出asdf
getch();
}