C语言中函数调用、实参、形参的选择

两种定义方式,两种调用函数,有四种组合

即为定义方式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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值