首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用、地址、解引用和指针的含义

引用、地址、解引用和指针的含义
EN

Stack Overflow用户
提问于 2020-08-10 04:11:20
回答 3查看 151关注 0票数 1

这是我理解C和C++中*&符号的方式。

在C语言中,*有两个用途。首先,它可以用来声明一个指针变量,比如int* pointerVariable

然而,它可以用作一个解引用运算符,比如*pointerVariable,它返回保存在该地址的值,它理解如何根据我们声明的指针所指向的数据类型来解释该地址的字节。因此,在我们的例子中,int*读取保存在该地址的字节并返回整数。

我们在C中也有address-of运算符,比如&someVariable,它返回someVariable名称下保存的字节的地址。

但是在C++中(而不是在C中),我们也可以像int& someReference一样在引用声明中使用&。这将把变量someReference变成一个引用,这意味着无论我们向该变量传递什么值,它都会自动获得我们传递给它的值的地址,它会保存它。

我的理解正确吗?

EN

回答 3

Stack Overflow用户

发布于 2020-08-10 05:14:25

我的理解正确吗?

是的,但最好从你想要做什么的角度来考虑指针和引用。

对于需要引用某个对象而不复制它的所有情况,引用都非常有用。引用很简单:它们总是有效的,并且在使用对象时语法没有变化。

指针是针对其余情况的。指针允许你处理地址(指针算术),需要显式的语法来引用它们后面的对象(*&->操作符),可以为空(NULLnullptr),可以修改,等等。

总而言之,引用更简单,更容易推理。当引用不能剪切它时,使用指针。

票数 2
EN

Stack Overflow用户

发布于 2020-08-10 05:44:56

定义指针的

  1. 通用语法:

data-type * pointer-name = &variable-name

指针的数据类型必须与它所指向的变量的数据类型相同。

data-types.

  • General类型指针可以处理所有用于定义引用变量的void语法:

data-type & reference-name = variable-name

引用变量的数据类型必须与它是其别名的变量的数据类型相同。

为了解释起见,让我们看一下它们中的每一个,我将用C和C++编写一个简单的交换程序。

在C中通过引用传递来交换两个变量

代码语言:javascript
复制
#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;
}

在上面的代码中,我们声明了变量ab,并将其初始化为1020 respectively.

  • We,然后使用<
  • >d21a>运算符将ab的地址传递给swap函数。这个运算符给出了variable.
  • These的地址,传递的参数被赋值给各自的形参,在本例中是int指针ptraptrb.
  • To交换变量,我们首先需要临时存储其中一个变量的值。为此,我们存储了指向变量temp的指针ptra所指向的值。这是通过首先使用dereference (*)运算符解引用指针,然后将其分配给temp来完成的。dereference (*)运算符用于访问存储在pointer.
  • Once,指向的内存位置中的值。ptra指向的值被保存,然后我们可以给它分配一个新值,在本例中,我们为它分配了变量b的值(同样是在dereference (*)运算符的帮助下)。并且将保存在temp中的值(a的原始值)分配给ptrb。因此,通过改变这些变量的内存位置来交换a和b的值。

注意:我们可以像这样一起使用dereference (*)运算符和addressof (&)运算符,*&a__,它们相互作废,只产生a

我们也可以用C++编写一个类似的程序,使用指针来交换两个数字,但是该语言支持另一个称为引用变量的类型变量。它为先前定义的变量提供别名(备用名称)。

在C++中通过引用调用交换两个变量

代码语言:javascript
复制
#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;
}

  • 在上面的代码中,当我们将变量ab传递给函数swap时,发生的情况是变量ab在<代码>D57中获得了各自的引用变量refarefb。这就像给了一个变量另一个别名。
  • 现在,我们可以不用dereferencing (*)运算符直接交换变量,使用reference variables.
  • Rest逻辑保持不变。
票数 1
EN

Stack Overflow用户

发布于 2020-08-11 00:19:33

答案很简单:

引用变量是传递给它们的数据的别名,另一个标签。

代码语言:javascript
复制
int var = 0;
int& refVar = var;

实际上,var和refVar是同一个对象。

值得注意的是,对堆指针数据的引用不能解除分配(delete)数据,因为它是数据的别名;

代码语言:javascript
复制
int* var = new int{0};
int& refVar = *var;
delete refVar // error

并且对指针本身的引用可以释放(delete)数据,因为它是指针的别名。

代码语言:javascript
复制
int* var = new int{0};
int*& refVar = var;
delete refVar // good
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63330857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档