C++引用、指针初始化及回收、值传参、指针传参和引用传参 详解

引用

  • &符号在C里面是取地址,但是在C++里面跟在类型名后就是是引用的意思而不是取地址。
  • 引用相当于给变量取别名,即改变引用等价于改变原来的变量值。
  • 一旦引用就不能再改变,即c是a的引用,就不能再变成b的引用。
  • 引用在定义时就必须被初始化。
  • 定义时指针、引用符号要靠近类型值(代码规范)。
1、三种传参示例
(1)值传参
# include <iostream>
using std::cout;
using std::endl;

//值传参
void swap1(int a,int b) {
	int c;
	c = a;
	a = b;
	b = c;
}
int main() {
	int x = 1;
	int y = 2;
	cout << "交换前x:" << x << ";y:" << y << endl;
	swap1(x, y);
	cout << "交换后x:" << x << ";y:" << y << endl;
	return 0;
}

结果:

交换前:1 2
交换前:1 2

其中:

初始最终类型
&x0x0086fb4c{1}0x0086fb4c{1}int*
&y0x0086fb40{2}0x0086fb40{2}int*
&a0x0086fa68{1}0x0086fa68{2}int*
&b0x0086fa6c{2}0x0086fa6c{1}int*

即:x,y与a,b的地址不同,更改的是a与b地址上所存储的值,而不改变x与y。

(2)指针传参
//指针传参	a存储的是参数的地址,*a是地址指向的值
void swap2(int* a,int* b) {
	int c;
	c = *a;
	*a = *b;
	*b = c;
}

int main() {
	int x = 1;
	int y = 2;
	cout << "交换前x:" << x << ";y:" << y << endl;
	swap2(&x, &y);
	cout << "交换后x:" << x << ";y:" << y << endl;
	return 0;
}

结果:

交换前:1 2
交换前:2 1

其中:

初始最终类型
&x0x00d8fd94 {1}0x00d8fd94 {2}int*
&y0x00d8fd88 {2}0x00d8fd88 {1}int*
&a0x00d8fcb0 {0x00d8fd94 {1}}0x00d8fcb0 {0x00d8fd94 {2}}int**
&b0x00d8fcb4 {0x00d8fd88 {2}}0x00d8fcb4 {0x00d8fd88 {1}}int**

即:x,y交换前后,地址不变,地址存储的值改变。
a,b存储的是x和y的地址,交换后改变的不是a,b存储的地址,而是a,b存储的地址所指向的值。
也就是说在a和b交换时是a和b指针的指针所指向的数据进行的交换。
& a,&b的类型为int**。

(3)引用传参
//引用传参
void swap3(int& a,int& b) {
	int c;
	c = a;
	a = b;
	b = c;
}
int main() {
	int x = 1;
	int y = 2;
	cout << "交换前x:" << x << ";y:" << y << endl;
	swap3(x, y);
	cout << "交换后x:" << x << ";y:" << y << endl;
	return 0;
}

结果:

交换前:1 2
交换前:2 1

其中:

初始最终类型
&x0x00bcf978 {1}0x00bcf978 {2}int*
&y0x00bcf96c {2}0x00bcf96c {1}int*
&a0x00bcf978 {1}0x00bcf978 {2}int*
&b0x00bcf96c {2}0x00bcf96c {1}int*
a12int&

即:x,y经过交换,地址不变,地址表示的值交换。
a,b为x,y的引用,地址就是x,y的地址,交换后地址表示的值交换,则x,y地址表示的值也交换(同一地址)。
a,b的类型为引用类型。

2、其他引用示例
	// 1、整型引用
	int x = 0, & rx = x;
	int& rx2=x;
	cout << rx2 << endl;
	2、常量指针类型引用
	char* s = "hello";
	char*& rs = s;	// rs的引用类型为char类型的指针,为s的引用
	cout << rs << endl;
3、C++指针的定义初始化以及回收
int main() {
	//空指针初始化
	int* p = nullptr;	//整型指针初始化
	int* q{ nullptr };	//数组指针初始化

	p = new int(42);
	q = new int[4];	//q存储的是数组首地址
	cout << "Before *P=" <<*p << endl;
	*p = 10;
	cout << "After *P=" << *p << endl;
	cout << "-------------" << endl;
	for (int i = 0; i < 4; i++) {
		cout << "Before *(q + i):" << *(q + i) << endl;
		*(q + i) = i;
	}
	for (int i = 0; i < 4; i++) {
		cout << "After *(q + i):" << *(q + i) << endl;
		*(q + i) = i;
	}
	cout << "-------------" << endl;
	cout << "*q:" << *q << endl;
	cout << "*q+2:" << *q+2 << endl;
	//回收指针
	delete p;
	delete[]q;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值