zl程序教程

您现在的位置是:首页 >  后端

当前栏目

浅析c/c++中函数的参数传递

C++ 函数 浅析 参数传递
2023-06-13 09:15:03 时间

下面来看一段代码,看看三种传递方式产生的结果。

复制代码代码如下:

#include<cstdlib>
#include<iostream>
usingnamespacestd;
voidchange1(intn)
{
    cout<<"值传递--函数操作地址"<<&n<<endl;
    n++;
}
voidchange2(int&n)
{
    cout<<"引用传递--函数操作地址:"<<&n<<endl;
    n++;
}
voidchange3(int*n)
{
    cout<<"指针传递--函数操作地址"<<n<<endl;
    *n=*n+1;
}
intmain(intargc)
{
   intn=10;
   cout<<"实参地址:"<<&n<<endl;
   cout<<"原值n="<<n<<endl;
   change1(n);
   cout<<"afterchange1n="<<n<<endl;
   change2(n);
   cout<<"afterchange2n="<<n<<endl;
   change3(&n);
   cout<<"afterchange3n="<<n<<endl;

   system("PAUSE");
   returnEXIT_SUCCESS;
}

打印结果如下:


可见,原值为10的实参n,change1函数没有改变它的值,而change2、change3函数则成功改变了它的值。
同时,查看函数的操作地址,也会发现,change1的操作地址并不是实参n的地址。
说明:
1.值传递的形式不会传递n本身,故不能改变n的值。
2.引用传递、指针传递,实际上就是将地址传入,能够成功对该地址进行操作。
但是需要注意:
1.引用和指针传递前,需要被初始化。
2.引用和指针在内存中开辟的储存单元应该是合法单元,不应该是NULL。
3.一旦引用被初始化,就不能改变引用的关系,而指针可以随意改变指向的对象。
对于没有初始化指针或者引用的情况,我们再来看一个例子:
复制代码代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
usingnamespacestd;
voidinit(char*p)
{
   p=(char*)malloc(100);
   cout<<"指针传递--函数操作地址"<<p<<endl;
}

intmain()
{
   char*p=NULL;
   cout<<"实参原地址"<<p <<endl;
   init(p);   

   if(p)
   {
       strcpy(p,"hello");
       printf("%s\n",p);
   }
   else
   {
       printf("%s","pnotinit\n");
   }
   free(p);
   system("PAUSE");
   returnEXIT_SUCCESS;
}

输出结果: