两种定义方式,两种调用函数,有四种组合
即为定义方式1+调用方式1,定义方式1+调用方式2,定义方式2+调用方式1,定义方式2+调用方式2
定义方式1
void get_str( char* p )
{
p = (char * )malloc ( 1 + sizeof ( "testing")) ;
strcpy ( p , "testing") ;
}
定义方式2
void get_str ( char** p )
{
*p = ( char * )malloc (1 + sizeof ("testing")) ;
strcpy (*p ,"testing");
}
调用方式1
int main ()
{
char* ptr = NULL;
get_str ( ptr );
if ( ptr )
printf ( "%s\n" , ptr ) ;
else
printf ( "%p\n" , ptr ) ; //输出指针的值
return 0 ;
}
调用方式2
int main ()
{
char* ptr = NULL;
get_str ( &ptr ) ;
if ( ptr )
printf ( "%s\n" , ptr ) ;
else
printf ( "%p\n" , ptr ) ;
return 0;
}
对于定义方式1,其函数首部为 void get_str (char* p) 。其中参数p 是指针参数,要求调用该函数时的实参应该为指针,可以使字符数组名(或者字符变量的地址,或者指针变量)。在调用方式1中,正是以指针变量ptr为实参,此时采用的是传值调用,其返回到调用函数main时,ptr的值并没有变化仍为NULL ,因此定义方式1+调用方式1,程序输出为000000.
而在调用方式2中是以指针变量ptr的地址为实参进行调用的,开始执行函数get_str时,指针p指向的目标为变量ptr。但是调用了函数malloc之后,重新为P指针赋值,即p指向了其他存储区(存储区内容为testing),但是目标变量ptr的内容没有改变,由于其采用的参数传递方式为传值调用,返回main函数时,ptr的值没有改变,定义方式1+调用方式2程序输出结果仍未000000
对于定义方式2,其函数首部为 void get_str(char** p) 。其中参数p是指向指针的指针参数,要求调用该函数时的实参为指针的地址。在调用方式1中,是以指针变量ptr为实参,这与形参要求的格式不匹配,所以定义方式1+调用方式2会出现运行错误。
而在调用方式2中,是以指针变量ptr的地址为实参进行调用的,符合形参的匹配要求,在函数get_str(char** p)中,*p表示目标变量ptr,通过将malloc申请到的存储区域首地址复制给*p,即ptr指向所申请到的存储区的起始位置,串拷贝函数strcpy()运行之后,将字符串“testing”放入该村出去,最后返回到调用函数main()中,ptr指向的目标改变了,因此定义方式2+调用方式2程序运行结果为“testing”