一、非引用形参 值传递
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;
}
引用形参直接关联到其所绑定的对象,而非这些对象的副本。 所以这种方法可以修改实参的值,而且更加直观。
其他:引用只是申明,不是定义,不占内存
对于大数据体实际参数,即使只要求单向传递给函数,也常使用引用型传递,以避免建立副本,节省时间、空间。当然,实参必须是可以引用的量
三种方法实例代码:
// 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