参数传递:传值、传址、传引用
//主程序代码
CString strUserId = "001";
CString strUserName = "none";
BOOL bFind = FindUserName(strUserId, strUserName);
if( bFind )
{
MessageBox("User Name:" + strUserName);
}
else
{
MessageBox("No found!");
}
//查找用户函数
BOOL FindUserName(CString& strUserIdParam, CString& strUserNameParam)
{
if( strUserIdParam == "001" )
{
strUserNameParam = "aa";
return TRUE;
}
return FALSE;
}
这里用的是传引用,程序运行结果是:User Name:aa。传引用时,实参和形参是同一对象,形参相当于是别名,类似快捷方式。
如果把查找用户函数修改为:
BOOL FindUserName(CString strUserIdParam, CString strUserNameParam)
则上面代码段的运行结果是:User Name:none。属于传值调用,形参和实参完全是不同的两个对象。内存会开辟一个临时变量复制了实参的值,函数中只是改变了临时变量的值,实参的值并未变化。
如果把查找用户函数修改为:
BOOL FindUserName(CString *strUserIdParam, CString *strUserNameParam)
调用改为:FindUserName(&strUserId, &strUserName);
则程序的运行结果是:User Name:aa。属于传址调用。实参和形参是两个完全没有关系的指针变量,但指向同一块内存区域。因此改变其中任意一个,都会带来所有的改变。
综上可知,在作为参数传递时,指针和引用可以起到相同的效果。但指针和引用也存在这略微差别:
指针可以为NULL,但引用必须初始化,不能为NULL。
指针被初始化后,仍可以随意改变;但引用被初始化后,不能改变引用的关系。
如:int i = 5;
int j = 6;
int &k = i;
k = j; // k 和i 的值都变成了6;