针对“详谈C++引用&和指针在作为形参时的区别”这个话题,我们可以从以下几个方面来进行讲解:
- 引用&和指针的定义与基本概念
- 在作为函数参数传递时的区别
- 示例说明
1. 引用&和指针的定义与基本概念
在C++中,引用(&)和指针(*)都是用于间接访问内存的机制,它们之间也有许多相似的地方。具体的定义和概念如下:
引用&
引用是C++中一种特殊的数据类型,它是一个别名,可以对已经存在的变量进行引用。换言之,一个引用就是一个变量的别名,对引用的操作和对变量的操作效果是一样的,它们在内存中共享同一块地址。在定义时需要使用&符号,如下所示:
int a = 10;
int &b = a;
其中,a是一个整型变量,b是a的一个引用,相当于对a起个别名b。这里需要注意的是,引用在定义时必须初始化,而且只能初始化一次。
指针*
指针是C++中也是一种特殊的数据类型,它是一个变量,存储的是一个地址。通过指针我们可以直接操作内存中的数据。在定义时需要使用*符号,如下所示:
int a = 10;
int *p = &a;
其中,p是一个指向a的指针,在内存中存储的是a的地址。通过指针,我们可以直接访问和操作a的值。
2. 在作为函数参数传递时的区别
当引用和指针作为函数参数传递时,他们有着不同的特性和表现:
引用&作为函数参数
当将引用作为函数参数进行传递时,函数的形参将是原参数的一个别名,指向同一内存单元,在函数内可以直接对于原引用的变量进行修改,修改后的值将会影响到原来的变量。具体的示例代码如下所示:
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10, b = 20;
cout << "Before swap: a = " << a << ", b = " << b << endl;
swap(a, b);
cout << "After swap: a = " << a << ", b = " << b << endl;
return 0;
}
在上述代码中,函数swap()的参数是两个整型引用a和b,当swap()函数被调用时,a和b将直接引用原始的变量,在函数内部直接进行交换,交换结果会反映到原始变量上,因此输出的结果也会相应改变。
指针*作为函数参数
当将指针作为函数参数进行传递时,指针存储的是地址,而函数接收的实际上是这个地址的副本,函数内部对于指针变量的修改不会影响到原始的变量。具体的示例代码如下所示:
#include <iostream>
using namespace std;
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 10, b = 20;
int *p1 = &a, *p2 = &b;
cout << "Before swap: a = " << a << ", b = " << b << endl;
swap(p1, p2);
cout << "After swap: a = " << a << ", b = " << b << endl;
return 0;
}
在上述代码中,函数swap()的参数是两个整型指针a和b,当swap()函数被调用时,函数内部将进行指针指向变量的交换,但是交换结果不会反映到原始变量的值上,故输出的结果并未改变。
3. 示例说明
我们用一个更具体的例子来说明引用和指针在作为函数参数传递时的区别:
#include <iostream>
using namespace std;
void modify(int &a, int *p)
{
a++;
(*p)++; // 括号要添加,避免错误
}
int main()
{
int x = 5;
int *y = &x;
cout << "Before modification: x = " << x << ", *y = " << *y << endl;
modify(x, y);
cout << "After modification: x = " << x << ", *y = " << *y << endl;
return 0;
}
在上面的例子中,modify()函数接收一个int类型的引用a和一个int型的指针p,x的值为5,p指向的地址为x。modify()函数内部分别修改a和p指向的变量值,其中对于a的修改会直接修改原始变量的值,而对于p指向的变量修改则通过解引用指针(*p)进行修改,解引用后得到的是实际的变量值,无法直接影响原始变量。运行代码,输出结果如下所示:
Before modification: x = 5, *y = 5
After modification: x = 6, *y = 6
可以看到,对于引用的修改已经反映到了原始变量上,而对于指针所指向变量的修改不会直接反映到原始变量上,需要通过指针进行间接访问修改。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详谈C++引用&和指针在作为形参时的区别 - Python技术站