/*
**test21.cpp : Defines the entry point for the console application.
**系统winXP SP3 32位.
**引用和指针的比较与函数传值、地址、引用的详解
*/
#include "stdafx.h"
#include "iostream.h"
void add_f1(int fiNum){
fiNum += 1;
}
void add_f2(int* fiNum){
fiNum += 1;
}
void add_f3(int* fiNum){
*fiNum += 1;
}
void add_f4(int& fiNum){
fiNum += 1;
}
int main(int argc, char* argv[])
{
int iNum1 = 1, iNum2 = 2;
cout<<"before iNum1 = "<<iNum1<<endl; //1
cout<<"before iNum2 = "<<iNum2<<endl; //2
int& rNum = iNum1;
rNum = iNum2;
cout<<"after iNum1 = "<<iNum1<<endl; //2
cout<<"after iNum2 = "<<iNum2<<endl; //2
cout<<"after rNum = "<<rNum<<endl; //2
rNum = 0;
cout<<"after iNum1 = "<<iNum1<<endl; //0
cout<<"after iNum2 = "<<iNum2<<endl; //2
cout<<"after rNum = "<<rNum<<endl; //0
int fiNum1 = 0;
add_f1(fiNum1);
cout<<"fiNum1 = "<<fiNum1<<endl; //0,不是在函数中加了一吗?
int fiNum2 = 0;
add_f2(&fiNum2);
cout<<"fiNum2 = "<<fiNum2<<endl; //0,不是在函数中加了一吗?
int fiNum3 = 0;
add_f3(&fiNum3);
cout<<"fiNum3 = "<<fiNum3<<endl; //1,成功
int fiNum4 = 0;
add_f4(fiNum4);
cout<<"fiNum4 = "<<fiNum4<<endl; //1,成功
return 0;
}
Tips1:引用“&”并不是简单的取地址的意思,比如int m = 0;int& n = m;这里n相当于m的别名,对n的操作也会同样的发生在m上。
Tips2:引用创建之初就要赋值,即引用到一个具体的变量上,这里食欲指针是不同的,指针在定义的时候不需要初始化,可在后续重新赋值。
Tips3:不存在NULL的引用,所有的引用都必须指向一个固定的内存空间,而指针是存在空指针的。
Tips4:引用的创建于销毁并不会调用拷贝函数与析构函数,所以很多时候使用引用会大大增加程序的运行效率,比如在函数返回值上。