引用是c++对c语言的功能补充。
引用和取地址的区别:只有在数据类型后的
&
才是引用声明。
int a = 5;
int* b = &a;//定义指针变量b,指向a的地址。两者在内存中占不同的位置。
int& c = a; //定义c作为a的别名。两者在内存中占同样的位置。
1. 指针作形参
#include "malloc.h"
#include <iostream>
using namespace std;
void fun(int* b) //用指针做形参
{
b = (int*)malloc(sizeof(int) * 3);
for (int i = 0; i < 3; i++)
b[i] = i;
}
int main()
{
int* a = NULL;
//a = (int*)malloc(sizeof(int) * 3);
fun(a);
for (int i = 0; i < 3; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
运行时出现内存访问错误。因为指针作为实参传入时:
- 虽为地址传递,函数中指针与传入的指针指向同一地址,但指针变量所在内存空间不同。
- 当
fun
函数结束后,指针变量b
的生命周期结束。申请的动态内存没有任何指针指向,且未被释放,造成内存泄漏。指针变量a
仍为空。
若在main
中加入a = (int*)malloc(sizeof(int) * 3);
,不出现内存错误但结果不对。如下图:
2. 引用作形参
#include "malloc.h"
#include <iostream>
using namespace std;
void fun(int*& b) //用引用做形参
{
b = (int*)malloc(sizeof(int) * 3);
for (int i = 0; i < 3; i++)
b[i] = i;
}
int main()
{
int* a = NULL;
fun(a);
for (int i = 0; i < 3; i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
运行正确,如下:
引用作为实参传入时,fun
函数中的b
是main
中a
的别名,地址和内容与a
完全一样,对b
操作就是在对a
操作。
3. 引用的规范:
- 引用被创建时必须被初始化,即声明它作为哪一个变量(作为函数参数时除外),指针不用。
- 不能引用NULL,指针可以。
- 不能把已创建的引用改变为另一对象的引用。
举个例子:
int* a = NULL;
char* b = (char*)a;//转换可行
char* &c = (char*)a;//转换报错