我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?

Can I have an ELI5 for references and pointers and when to use them?

本文关键字:何时使 指针 ELI5 有一个 参考 我可以      更新时间:2023-10-16

我已经学习编码一段时间了,但仍然无法理解参考文献和指针。我搜索的每个答案对我来说都太复杂了。

例如,当我们调用要使用的变量时

int32 y = 1;
int32 x = 2;
int32 z = y + x;

1)"z"中到底发生了什么?它是通过引用、指针调用"y"和"x"还是仅通过变量调用它们?

在我目前正在学习的这段代码中

FString Log = TEXT("Hello");
FString* PrtLog = &Log;
Log.Len();
(*PrtLog).Len();
PrtLog->Len();

2)这是怎么回事?"PrtLog"是引用还是指针?

3)讲师说*PrtLog正在"取消引用"PrtLog。这是否意味着删除了对 PrtLog 的引用?* 和 -> 有什么区别

4)如果调用变量同样可以,为什么我们甚至需要引用或指针?

5)为什么有些人声称90%的变量将在更高级别使用引用和指针?它们有什么好处吗?如果我们只是按变量调用,不是更简单、更快吗?

对不起,如果这是太多问题。我无法在参考文献和指针上得到我能够在任何地方理解的答案,所以我真的很困惑。

1) "z"到底发生了什么?它是否通过以下方式调用"y"和"x" 引用,通过指针还是仅通过变量调用它们?

这些变量都不是指针或引用。他们只是..变量。xy是使用的变量。operator+(x, y).

2)这是怎么回事?"PrtLog"是引用还是指针?

PrtLog是一个指针,您可以通过查看其类型声明来查看这一点:

FString*

显然,它是指向FString的指针。

由于= &Log;,可能会出现混淆。在代码的这一部分中,&是获取指向Log的指针所需的地址运算符。&仅当它是类型的一部分时才表示引用,Log这里是变量,而不是类型。

3)讲师说*PrtLog正在"取消引用"PrtLog。这是否意味着 删除了对 PrtLog 的引用?有什么区别 * 和 ->

在这种情况下,取消引用只是一个不幸的名称,它意味着获取指针指向的"事物"。FString*是指向FString的指针,因此取消引用此类指针将产生FString

*->之间的区别在于->是 :(*pointer).或"取消引用pointer并访问其成员"的简写。

4)如果调用变量,为什么我们甚至需要引用或指针 也一样好吗?

想要使用指针或引用的原因可能有几个。例如,引用对象但不复制对象本身。

5)为什么有些人声称90%的变量将使用引用 和更高级别的指针?它们有什么好处吗?如果我们 只是按变量调用,不是更简单更快吗?

谁声称这一点?我没有数字,但这似乎不准确。当然,它们都是非常有用的构造,但是如果它们用于这些数字,则在很大程度上取决于项目。

xy被称为左值表达式(通常缩写为左值)。这意味着它们对应于内存位置。 表达式的上下文确定是将值写入内存位置,还是从内存位置检索值。

在代码x = 2;中,将一个值写入由x命名的位置。在代码x + 2中,从x命名的位置读取一个值。

PrtLog是一个指针,因为它是用指针声明符声明的。为什么有人会使用指针的问题在这里得到了回答:为什么要使用指针?

"取消引用"是指从指针表达式中删除间接寻址级别。 指针指向内存位置。取消引用指针的结果是对应于该内存位置的左值表达式。 这可以有多个级别。a->b等效于(*a).b如果a是一个指针。

指针只是一个数字。此数字对应于计算机 RAM 中存储相应变量值的位置。

int theAnswer = 42;
int *pointer = &theAnswer;
std::cout << pointer << 'n';
/*
* this will print where in memory `theAnswer` is stored,
* it'll just look like some random number. Try it out!
*/

所以在你的例子中,(2)PrtLog是一个指针。引用也是一个指针,但C++有点"隐藏"它是一个。

(3)请记住,指针只是一个数字。因此,如果你想使用指针的值,而不是用指针本身做数学运算(你不应该这样做),你需要以某种方式"跟随"该数字到存储值的位置。这就是取消引用的作用。它"跟随"指针以获取其值,并允许您执行诸如调用函数或修改它之类的操作。

// make an integer variable
int theAnswer = 42;
int *pointer = &theAnswer;
std::cout << "Original: " << theAnswer << " Pointer: " << *pointer << 'n';
// prints "Original: 42 Pointer 42"
*pointer = 41;
std::cout << "Original: " << theAnswer << " Pointer: " << *pointer << 'n';
// prints "Original: 41 Pointer 41"

(4)有时你只是无法访问原始的,比如运行时内存分配,或者如果你想创建一个方法来改变变量,等等。在 c++ 中,很多内容都隐藏在标准库中,其中包含引用和类之类的内容,但仍然偶尔会出现。虽然,如果你在C++中使用原始指针(而不是引用或 RAII 类),你应该有一个很好的理由这样做,泄漏内存真的很容易。

// you can only access this variable though the pointer
int *dynamic = new int;
*dynamic = 42;
std::cout << *dynamic << 'n';
delete dynamic;

(5)这似乎与4是同一个问题,但我可能解释错了。

我希望这是清楚的。如果您有任何其他问题,请随时发表评论,我会尽力回答,我很乐意帮助本杰明的同胞!