先说两个题外话
“puts(p);//输出的是一个不确定的值” ------ 按标准规定,puts(NULL)属于“未定义行为”
return(0) ------ return是个关键字,它不是函数。就应该正常写作 return 0;
-------------------------------------
int main(){
char *p=NULL;
fun(p); // 它就等同于 fun( NULL )
puts(p); // 它就等同于 puts( NULL )
}
所以你整段代码直接等同于

程序代码:
#include <stdio.h>
int main( void )
{
puts( NULL );
}
-------------------------------------
对比一下以下两端代码

程序代码:
#include <stdio.h>
void foo( int x )
{
printf( "地址%p处的int变量值为 %d\n", &x, x );
x = 123;
printf( "地址%p处的int变量值为 %d\n", &x, x );
}
int main( void )
{
int a = 1;
printf( "地址%p处的int变量值为 %d\n", &a, a );
foo( a );
printf( "地址%p处的int变量值为 %d\n", &a, a );
}
与

程序代码:
#include <stdio.h>
void foo( int* x )
{
printf( "地址%p处的int变量值为 %d\n", x, *x );
*x = 123;
printf( "地址%p处的int变量值为 %d\n", x, *x );
}
int main( void )
{
int a = 1;
printf( "地址%p处的int变量值为 %d\n", &a, a );
foo( &a );
printf( "地址%p处的int变量值为 %d\n", &a, a );
}