帮小弟我解决下字符串指针的解释有关问题

帮我解决下字符串指针的解释问题!
void   GetMemory(   char   *p   )  


{  


p   =   (char   *)   malloc(   100   );  


}  


void   Test(   void   )  


{  


char   *str   =   NULL;  


GetMemory(   str   );  


strcpy(   str,   "hello   world "   );  


printf(   str   );  


}  


这是我在看面试题给出的答案
有些东西还是不明白
有人能帮解决吗?
试题四的给出的答案是

传入中GetMemory(   char   *p   )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完

char   *str   =   NULL;  
GetMemory(   str   );  
后的str仍然为NULL;

为什么函数内部修改形参并不能真正的改变传入形参的值?函数的调用是是传递的地址传递,在函数中重新改变了p的值,为什么不能改变主函数中的str那?




------解决方案--------------------
void GetMemory( char **p )
{
*p = (char *) malloc( 100 );
}


char *str = NULL;
GetMemory( &str );