这是我理解C和C++中*和&符号的方式。
在C语言中,*有两个用途。首先,它可以用来声明一个指针变量,比如int* pointerVariable
然而,它可以用作一个解引用运算符,比如*pointerVariable,它返回保存在该地址的值,它理解如何根据我们声明的指针所指向的数据类型来解释该地址的字节。因此,在我们的例子中,int*读取保存在该地址的字节并返回整数。
我们在C中也有address-of运算符,比如&someVariable,它返回someVariable名称下保存的字节的地址。
但是在C++中(而不是在C中),我们也可以像int& someReference一样在引用声明中使用&。这将把变量someReference变成一个引用,这意味着无论我们向该变量传递什么值,它都会自动获得我们传递给它的值的地址,它会保存它。
我的理解正确吗?
发布于 2020-08-10 05:14:25
我的理解正确吗?
是的,但最好从你想要做什么的角度来考虑指针和引用。
对于需要引用某个对象而不复制它的所有情况,引用都非常有用。引用很简单:它们总是有效的,并且在使用对象时语法没有变化。
指针是针对其余情况的。指针允许你处理地址(指针算术),需要显式的语法来引用它们后面的对象(*,&,->操作符),可以为空(NULL,nullptr),可以修改,等等。
总而言之,引用更简单,更容易推理。当引用不能剪切它时,使用指针。
发布于 2020-08-10 05:44:56
定义指针的
data-type * pointer-name = &variable-name
指针的数据类型必须与它所指向的变量的数据类型相同。
data-types.
void语法:data-type & reference-name = variable-name
引用变量的数据类型必须与它是其别名的变量的数据类型相同。
为了解释起见,让我们看一下它们中的每一个,我将用C和C++编写一个简单的交换程序。
在C中通过引用传递来交换两个变量
#include <stdio.h>
void swap(int *,int *); //Function prototype
int main()
{
int a = 10;
int b = 20;
printf("Before Swap: a=%d, b=%d\n",a,b);
swap(&a,&b); //Value of a,b are passed by reference
printf("After Swap: a=%d, b=%d\n",a,b);
return 0;
}
void swap(int *ptra,int *ptrb)
{
int temp = *ptra;
*ptra = *ptrb;
*ptrb = temp;
}在上面的代码中,我们声明了变量a和b,并将其初始化为10和20 respectively.
a和b的地址传递给swap函数。这个运算符给出了variable.int指针ptra和ptrb.temp的指针ptra所指向的值。这是通过首先使用dereference (*)运算符解引用指针,然后将其分配给temp来完成的。dereference (*)运算符用于访问存储在pointer.ptra指向的值被保存,然后我们可以给它分配一个新值,在本例中,我们为它分配了变量b的值(同样是在dereference (*)运算符的帮助下)。并且将保存在temp中的值(a的原始值)分配给ptrb。因此,通过改变这些变量的内存位置来交换a和b的值。注意:我们可以像这样一起使用dereference (*)运算符和addressof (&)运算符,*&a__,它们相互作废,只产生a
我们也可以用C++编写一个类似的程序,使用指针来交换两个数字,但是该语言支持另一个称为引用变量的类型变量。它为先前定义的变量提供别名(备用名称)。
在C++中通过引用调用交换两个变量
#include <iostream>
using namespace std;
void swap(int &,int &); //Function prototype
int main()
{
int a = 10;
int b = 20;
cout << "Before Swap: a= " << a << " b= " << b << endl;
swap(a,b);
cout << "After Swap: a= " << a << " b= " << b << endl;
return 0;
}
void swap(int &refa,int &refb)
{
int temp = refa;
refa = refb;
refb = temp;
}a和b传递给函数swap时,发生的情况是变量a和b在<代码>D57中获得了各自的引用变量refa和refb。这就像给了一个变量另一个别名。dereferencing (*)运算符直接交换变量,使用reference variables.发布于 2020-08-11 00:19:33
答案很简单:
引用变量是传递给它们的数据的别名,另一个标签。
int var = 0;
int& refVar = var;实际上,var和refVar是同一个对象。
值得注意的是,对堆指针数据的引用不能解除分配(delete)数据,因为它是数据的别名;
int* var = new int{0};
int& refVar = *var;
delete refVar // error并且对指针本身的引用可以释放(delete)数据,因为它是指针的别名。
int* var = new int{0};
int*& refVar = var;
delete refVar // goodhttps://stackoverflow.com/questions/63330857
复制相似问题