Linux-C语言传参方式

参数传递三种方式:
值传递 :未操作实参的地址 操作的是形参的数值,不能改变实参的值
地址传递 :操作实参的地址,实参值改变
引用传递:引用操作形参相当于操作实参,实参值改变

值传递:如果形参为非引用的传值方式,则生成局部临时变量接收实参的值   

void Swap (int left, int right){  
         int temp = left;  
         left = right ;  
         right = temp ; }  
传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部left和right的值

引用传递:如果形参为引用类型,则形参是实参的别名

    void Swap (int& left, int& right){
          int temp = left;  
         right = left ;  
         left = temp ; }  
    使用引用不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改是直接在原参数的基础上修改变量值

指针传递: 操作实参的地址

    void Swap (int* pLeft, int* pRight){  
         int temp = *pLeft;  
         *pLeft = *pRight;  
         *pRight = temp; }  

传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容

引用解释:c++而非c
C++中的引用:
引用引入了对象的一个同义词,定义引用的表示方法与定义指针相似,只是用&代替了*,引用(reference)是c++对c语言的重要扩充,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。
引用的特点:
①一个变量可取多个别名。
②引用必须初始化。
③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。
eg:
基础引用:
void TestReference1 (){  
         int a = 1;  
         int& b = a;  
         a = 2;  
         b = 3;  
         int& c = b;// 引用一个引用变量,别名的别名  
         c = 4; }
const引用:
        void TestReference2 (){  
         int d1 = 4;  
         const int & d2 = d1;  
         d1 = 5;//d1改变,d2的值也会改变。  
         //d2 = 6;//不能给常量(不能被修改的量)赋值。  
         const int d3 = 1;  
         const int & d4 = d3;  
         //int&d5 = d3;  
         const int & d6 = 5;//常量具有常性,只有常引用可以引用常量  
         double d7 = 1.1;  
         //int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量,也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。  
         const int& d9 = d7;}    

&在c语言中的作用:&位于等号右侧为取址,位于左侧为引用
1.取地址符:
int a; int*p ; p =&a;  //p表示a的地址 这里&为取址符
2.引用:对引用操作相当于对原变量进行操作
int a; int &b=a ; //这里b指代a  &为引用符

值传递:
void Exchg1(int x, int y) 
{
   int tmp;
   tmp = x;
   x = y;
   y = tmp;
   printf("x = %d, y = %d.\n", x, y);x=6,y=4
}
main()
{
   int a = 4,b = 6;
   Exchg1(a, b);
   printf("a = %d, b = %d\n", a, b);a=4,y=6
   return 0;
}
解释:int x = a; int y = b;只是把变量a,b的值分别赋值给了x、y,
之后在Exchg1函数体内再也没有对a、b进行任何的操作了,交换的只是x、y变量,并不是a、b
引用传递:
void Exchg3(int &x, int &y)
{
   int tmp = x;
   x = y;
   y = tmp;
   printf("x = %d,y = %d\n", x, y);x=6,y=4
}
main()
{
   int a = 4;
   int b = 6;
   Exchg3(a, b);
   printf("a = %d, b = %d\n", a, b);a=6,b=4
   return(0);
}
x、y前都有一个取地址符号“&”。有了这个,调用Exchg3时函数会将a、b 分别代替了x、y了,
x、y分别引用了a、b变量。这样函数里头操作的其实就是实参a、b本身了
地址传递:
void Exchg2(int *px, int *py)
{
   int tmp = *px;
   *px = *py;
   *py = tmp;
   printf("*px = %d, *py = %d.\n", *px, *py);//x = 6, y = 4
}
main()
{
   int a = 4;
   int b = 6;
   Exchg2(&a, &b);
   printf("a = %d, b = %d.\n", a, b);//a = 6, b = 4
   return 0;
}
在Exchg2(&a, &b)中的隐含操作  px = &a, py = &b。指针px、py的值已经分别是a、b变量的地址值了。
对*px、*py的操作当然也就是对a、b变量本身的操作了。所以对函数里头的交换就是对a、b值的交换了,原理就是
传递a、b的地址给了px、py,(c语言变量在内存中都是地址存在的,操作地址可改变变量的值)

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值