c/c++函数调用传递方式比较

本文详细介绍了C/C++中函数调用的三种方式:值传递、指针传递(包括引用传递)的区别和应用场景。通过示例代码展示了不同传递方式下实参与形参的变化,并分析了函数`find1`和`find2`在参数传递上的差异,强调了地址传递在修改指针值时的重要性。
摘要由CSDN通过智能技术生成

屡次被函数调用方面的笔试题面试题恶心到,好吧,今天总结一下。

一、值传递
采用值传递方式时,在堆栈段中为被调函数的形参列表分配内存,主调函数的实参列 表分别赋给形参列表。因此,内存中每个形式参数和 实际参数都是不同的变量, 只是在发生函数调用的时刻,对应实参和形参变量的值相同而已。 值传递方式的特点是被调函数对形参的任何操作不会影响主调函数的实参的值 。

int  swap( int  x, int  y)  
{  
int  temp ;
temp = x ;x = y; y = te mp ;
cout<< " x="  << x <<", y="<<y<<endl  ;
return  temp ;
)  
void main( )  
(  
int  a = 10, b = 20 ;
swap( a, b)  ;
cout<<" a=" <<a<<", b="<<b<<endl;  
}

结果为
x=20,y=10  
a=l0, b=20  

形参发生改变,实参不变。


二、地址传递
地址传递分为指针传递和引用传递两种,下面将分别介绍:

1、指针传递
采用指针传递方式时,同样也需要在堆栈段中为被调函数的形参列表分配内存。但是,由于形参定义为指针类型,从主调函数传递过来的是实参列表各变量的地址。因此,指针传递方式的特点是被调函数对形参做的任何操作也都影响到主调函数中的实参的值。

int  swap( int  *x, int  *y)  
(  
int  temp; 
temp =  *x; *x = *y ; *y = temp ;  
cout<<"  *x="  << *x<<",  *y=" <<  *y<<endl;  
return temp; 
)  
void main( )  
{  
int  a = 10, b = 20;  
swap( & a, & b);  
cout<<"a= " <<a<<", b=" <<b<<endl ; 
)  

结果为
*x=20,*y=10  
a=20,b=10  

形参发生改变,实参改变。

2、引用传递
采用引用传递方式时,同样也需要在堆栈段中为被调函数的形参列表分配内存。 但是,由于形参定义为引用类型,从主调函数传递过来的是实参列表各变量的地址。 被调函数对形参的任何操作都被处理成是对实参的间接寻址。因此,引用传递方式的特点是被调函数对形参做的任何操作都影响到主调函数中的实参的值 。
int  swap( int  &x, int  &y)  
(  
int  temp; 
temp =  x; x = y ; y = temp ;  
cout<<"  x="  << x<<",  y=" <<  y<<endl;  
return temp; 
)  
void main( )  
{  
int  a = 10, b = 20;  
swap( & a, & b);  
cout<<"a= " <<a<<", b=" <<b<<endl ; 
)  

结果为
x=20,y=10  
a=20,b=10  

形参发生改变,实参改变。

分析下题:
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。  

void find1(char [] array, char search, char * pa)
{
    int i;
    for (i=0;*(array+i)!=0;i++)
    {
       if (*(array+i)==search)
       {
         pa=array+i
         break;
       }
       else if (*(array+i)==0)
       {
         pa=0;
         break;
       }
    }


void find2(char [] array, char search, char ** ppa)
{
    int i;
    for (i=0;*(array+i)!=0;i++)
    {
       if (*(array+i)==search)
       {
         *ppa=array+i
         break;
       }
       else if (*(array+i)==0)
       {
         *ppa=0;
         break;
       }
    }


void main()
{
   char str[]={“afsdfsdfdf\0”};  //待查找的字符串
   char a=’d’;   //设置要查找的字符
   char * p=0;  //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。
  
   find1(str,a,p);  //调用函数以实现所要操作。
   //find2(str,a,&p);
  
   if (0==p )
   {
      printf (“没找到!\n”);//1.如果没找到则输出此句
   }
   else
   {
      printf(“找到了,p=%d”,p);  //如果找到则输出此句
   }


结论:
很明显,find1将无法查找到d,原因是find1中pa为值传递,被调函数对形参做的任何操作也都影响到主调函数中的实参的值。p本身为指针,是个地址,find11需要的第三个形参也为地址。故将p赋给pa时候为值传递。
而要修改p的值,则必须将p的地址传递给find1,也即出现了find2,需要的第三个形参为指向指针的指针,即接受指针p的地址。这样对*ppa的修改即为对p的修改。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值