C++引用,传值,传地址(初学到进阶)

这里今天主要介绍传值;传地址;传引用的各自的使用方法、优缺点、局限以及指针和引用的不同点。
统一的头文件和作用域:

#include<stdio.h>
#include<iostream>
using namespace std;

1.按照值的方式进行传参
传值:优点–传参 函数的副作用 安全
缺点–>传参效率低,不能通过形参改变实参

void Swap(int left, int right) {
	cout << &left << "  " << &right << endl;
	int temp = left;
	left = right;
	right = temp;
}

int main() {
	int a = 10;
	int b = 20;
	Swap(a, b);
	Swap(&a, &b);
	cout << &a << "  " << &b << endl;
	system("pause");
	return 0;
}

2.按照地址的方式进行传参
传址:优点–> 传参效率高;通过形参改变实参只能通过传地址的方式
缺点–> 不安全,可定性差

void Swap(int* left, int* right) {
	int temp = *left;
	*left = *right;
	*right = temp;
}

int main() {
	int a = 10;
	int b = 20;
	Swap(a, b);
	Swap(&a, &b);
	cout << &a << "  " << &b << endl;
	system("pause");
	return 0;
}

**3.

引用是对象的别名,是函数的形参

传引用:通过引用交换形参,就是在修改实参。可以代替指针。**

/引用
int main() {
	int a = 10;
	int& ra = a;
	ra = 100;

	int& rra = a;
	rra = 20;

	int b = 10;
	a = b;
	a = 20;

	system("pause");
	return 0;
}

引用用的是同一份空间

//引用用的同一份空间  
int main() {
	const int a = 10;
	const int& ra = a;
	//ra = 100;

	const int& rb = 10;

	double d = 12.34;
	const int& rd = d;
	
	d = 23.34;
	return 0;
}

作为函数的参数: 需要通过形参改变外部实参 T&
不需要通过形参改变外部实参 const T&

struct A {
	int a;
	int b;
	int c;
};

int main() {
	int a = 10;
	int& ra = a;

	A aa;
	int& rb = aa.b;
	system("pause");
	return 0;
}
//通过引用交换形参,就是在修改实参。可以代替指针。
void Swap(int& left, int& right) {
	cout << &left << "  " << &right << endl;

	int temp = left;
	left = right;
	right = temp;
}

void Print(int& ra) {
	cout << &ra << endl;
}

int main() {
	int a = 10;
	int b = 20;
	Swap(a, b);
	Print(a);
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
引用和指针的关系:
引用在底层实际上按照指针的方式进行处理的。(引用和指针在底层上没有区别)
T&<—>T const
const T&<—>const T
const**
概念:引用与其实体共用同一块内存
引用–>对象的别名

int main() {
	int a = 10;
	
	int* pa = &a;
	*pa = 20;
	
	int& ra = a;
	ra = 20;

	system("pause");
	return 0;
}

在这里插入图片描述

引用和指针的不同点:1.引用定义时必须初始化 而指针没有要求
2.引用在初始化时引用一个实体后,就不能引用其他实体;而指针可以在任何时候指向任何实体
3.没有NULL引用,有NULL指针。
4.没有多级引用,有多级指针
5.sizeof中含义不同:引用结果为实体的大小(1),指针始终是地址空间所占大小(c,一个占4字节)
6.引用++则实体增加1,指针++即指针向后偏移一个类型的大小
7.访问实体方式不同,指针需要解引用;引用不用,编译器自己处理
8.引用比指针更安全

int main() {
	int a = 10;
	int b = 20;

	int& ra = a;
//	int& ra = b;    //不能引用其他实体
	ra++;


	int* pa;
	pa = &a;
	*pa = 100;   //解引用
	pa = &b;  //指针可以在任何时候指向任何实体
//	pa++;   连续地址上++才有意义

	char c = 'a';
	char& rc = c;
	char* pc = &c;
	
	cout << sizeof(rc) << "  " << sizeof(pc) << endl;
	system("pause");
}

运行结果:
在这里插入图片描述

int  main() {
	const int a = 10;
	int* pa = (int*)&a;
	*pa = 100;

	cout << a << endl;
	cout << *pa << endl;
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值