C++函数的形参(非引用形参、指针形参、引用形参)

一、非引用形参 值传递

      void add1(int v1)
      {
          v1+=1;
      }

      这是最普通的形参方式,当函数被调用时,实参的副本初始化形参,函数并没有访问调用所传递的实参,因此v1+=1不会修改实参的值。对v1的操作只是修改了实参的一个副本。

二、指针形参  指针传递

      void add2(int *p)
      {
          *p+=1;
          p+=1;
      } 

      使用指针做为函数的形参,同样指针的值(指针的地址)不会因为p+=1而受到影响,但是指针指向的地址的值(*p)将会改变。所以要想修改实参的值,可以使用这种方法。但是还有一种更安全更自然的方法-引用形参


           数组在函数之间的传递:

#include <iostream>

using std::cout;
using std::endl;

//传入数组三要素

//其他:函数没有义务,也不可能判断调用本函数时所提供的实际参数的合理性、正确性

void showshuzu(const int *arr,int size){
	for(int i=0;i<size;i++){
		cout<<arr[i]<<" ";
	}
	cout<<endl;
}

int main(){
	int a[5] = {1,2,3,4,5};
	showshuzu(a,5);
	return 0;
}



三、引用形参  引用传递

      void swap(int &a,int &b)
      {
          int temp=a;
          a=b;
          b=temp;
       }

      引用形参直接关联到其所绑定的对象,而非这些对象的副本。 所以这种方法可以修改实参的值,而且更加直观。 

      其他:引用只是申明,不是定义,不占内存


对于大数据体实际参数,即使只要求单向传递给函数,也常使用引用型传递,以避免建立副本,节省时间、空间。当然,实参必须是可以引用的量

三种方法实例代码:

// liujiajia
// 2008-7-14 
#include < iostream >
using   namespace  std;
void  add1( int );
void  add2( int * );
void  swap( int   & , int   & );
int  main( void )
{
    
int  n = 10 ;
    cout
<< " 调用add1()之前n= " << n << endl;
    add1(n);
    cout
<< " 调用add1()之后n= " << n << endl;
    
    
int   * p =& n;
    
    cout
<< " 调用add2()之前n= " << n << " ,p= " << p << endl;
    add2(p);
    cout
<< " 调用add2()之后n= " << n << " ,p= " << p << endl;
    
    
int  a = 1 ,b = 2 ;
    cout
<< " 调用swap()之前a= " << a << " ,b= " << b << endl;
    swap(a,b);
    cout
<< " 调用swap()之后a= " << a << " ,b= " << b << endl;
    
    getchar();
}

// 非引用形参 
void  add1( int  v1)
{
    v1
+= 1 ;
}

// 指针形参
void  add2( int   * p)
{
    
* p += 1 ;
    p
+= 1 ;


// 引用形参
void  swap( int   & a, int   & b)
{
    
int  temp = a;
    a
= b;
    b
= temp;
}

from : http://www.cppblog.com/liujiajia/archive/2008/07/14/56054.html


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


引用是C++中的概念,初学者容易把引用和指针混淆一起。 
一下程序中,n是m的一个引用(reference),m是被引用物(referent)。 
int m; 
int &n = m; 
n相当于m的别名(绰号),对n的任何操作就是对m的操作。 
所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。 

引用的规则: 

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。 
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。 
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。 

以下示例程序中,k被初始化为i的引用。 
语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。 
由于k是i的引用,所以i的值也变成了6。 
int i = 5; 
int j = 6; 
int &k = i; 
k = j; // k和i的值都变成了6; 

引用的主要功能是传递函数的参数和返回值。 


"引用传递"的性质象"指针传递",而书写方式象"值传递"。 

实际上"引用"可以做的任何事情"指针"也都能够做,为什么还要"引用"这东西? 
答案是"用适当的工具做恰如其分的工作"。
 

指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。 
如果的确只需要借用一下某个对象的"别名",那么就用"引用",而不要用"指针",以免发生意外。


from : http://blog.csdn.net/wanjichun/article/details/3279494


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------



int i;

int *a = &i;//这里a是一个指针,它指向变量i

int &b = i;//这里b是一个引用,它是变量i的引用,引用是什么?它的本质是什么?下面会具体讲述

int * &c = a;//这里c是一个引用,它是指针a的引用,指针的引用

int & *d;//这里d是一个指针,它指向引用,但引用不是实体,所以这是错误


int * &a和int & *a

我在写这两句语句时,在int 和*(&)间空了一格,而后面的&(*)紧跟a。原因是:分析此类语句时,先看a前紧跟的是什么,它决定了a的类型。而int后的一个空格是为了防止int *a, b;//a是指针,而b不是。


from:http://www.cnblogs.com/netqer/archive/2008/10/20/1315386.html



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


???

c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间;
d) int (*a)[10];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。
以上四种类型见上图表示。

e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。


from :http://www.zhihu.com/question/20481976

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值