C++学习(五):引用和指针的简单理解

1 引用–>效率是关键!!

1.1 引用解决的是什么问题?

C++函数中参数的传递方式是传值。在函数域中为参数重新分配内存。而把实参的数值传递到新分配的内存中。这样能有效地避免函数的副作用。

如果要求改变的实参是一个复杂的对象,重新分配内存就会引起程序执行效率大大下降。于是在C++中使用一种新的导出型数据类型——引用(reference),可以解决上面的难题,引用又称别名(alias)。

上面的话是什么意思呢?举个栗子:

void swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void main()
{
	int a = 10;
	int b = 20;
	swap(a,b);
}

我们想要让a=20,b=10;但上面的swap函数不能将实参转换过来,即运行完以后,a依旧=10,b=20。问题出在我们应该代入的是实参对应的地址,即指针的方式传递,如下:

void swap(int *x, int *y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
void main()
{
	int a = 10;
	int b = 20;
	swap(&a,&b);  //&a,&b是两个实参的地址
}

这里对指针不熟悉的同学可以参考 菜鸟教程——C++指针 或者翻到最底看补充部分。

那么如果放到C++里面,我们就不用指针这么麻烦了,直接使用引用&就可以解决,解决如下:

void swap1(int &x, int &y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
void main()
{
	int a = 10;
	int b = 20;
	swap1(a,b);
}

即可达到上述交换实参的目的。

其上述的实质是,当我们一开始使用int x,int y时,相当于新开辟了两个存储空间,所以在函数内部的操作实际上只影响到了新开辟的存储空间,故而主函数中的实参没有改变;而当我们使用引用 int &x,int &y时,就不会再为x,y新开辟空间,只是相当于给实参a,b新取了两个名字x和y,大大提高了代码的效率。

1.2 引用的定义

引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C++系统不为引用类型变量分配内存空间。引用主要用于函数之间的数据传递。

定义的格式为:

类型 &引用变量名 = 已定义过的变量名;

在这里插入图片描述跟指针一样,我们的引用可以对变量、对指针、对数组进行引用;但对常量的引用只能用常引用;对变量可以进行常引用(const 引用)。

在这里插入图片描述

2 补充——指针

指针 int *ip 是一个变量,其值 ip 为另一个变量的地址,即内存位置的直接地址。指针变量使用前需要声明,一般形式为:

类型 *指针变量的名称;

eg: float *fp; 表示一个浮点型的指针。

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

使用指针时会频繁进行以下几个操作:

  • 定义一个指针变量 int *ip;
  • 把变量地址赋值给指针
  • 访问指针变量中可用地址的值
#include <iostream>
using namespace std;
 
int main ()
{
   int  var = 20;   // 实际变量的声明
   int  *ip;        // 指针变量的声明
 
   ip = &var;       // 在指针变量中存储 var 的地址
 
   cout << "Value of var variable: ";
   cout << var << endl;  // 20
 
   // 输出在指针变量中存储的地址
   cout << "Address stored in ip variable: ";
   cout << ip << endl;  // 0xbfc601ac
 
   // 访问指针中地址的值
   cout << "Value of *ip variable: ";
   cout << *ip << endl;  // 20
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值