[c++学习笔记]指针与引用的区别

引用是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;
}

运行时出现内存访问错误。因为指针作为实参传入时:

  1. 虽为地址传递,函数中指针与传入的指针指向同一地址,但指针变量所在内存空间不同。
  2. 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函数中的bmaina的别名,地址和内容与a完全一样,对b操作就是在对a操作。

3. 引用的规范:

  1. 引用被创建时必须被初始化,即声明它作为哪一个变量(作为函数参数时除外),指针不用。
  2. 不能引用NULL,指针可以。
  3. 不能把已创建的引用改变为另一对象的引用。

举个例子:

int* a = NULL;
char*  b = (char*)a;//转换可行
char* &c = (char*)a;//转换报错

参考:
C++引用&和指针在作为形参时的区别
C++ 引用与引用作为函数的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值