我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
Can I have an ELI5 for references and pointers and when to use them?
我已经学习编码一段时间了,但仍然无法理解参考文献和指针。我搜索的每个答案对我来说都太复杂了。
例如,当我们调用要使用的变量时
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" 引用,通过指针还是仅通过变量调用它们?
这些变量都不是指针或引用。他们只是..变量。x
和y
是使用的变量。operator+(x, y)
.
2)这是怎么回事?"PrtLog"是引用还是指针?
PrtLog
是一个指针,您可以通过查看其类型声明来查看这一点:
FString*
显然,它是指向FString
的指针。
由于= &Log;
,可能会出现混淆。在代码的这一部分中,&
是获取指向Log
的指针所需的地址运算符。&
仅当它是类型的一部分时才表示引用,Log
这里是变量,而不是类型。
3)讲师说*PrtLog正在"取消引用"PrtLog。这是否意味着 删除了对 PrtLog 的引用?有什么区别 * 和 ->
在这种情况下,取消引用只是一个不幸的名称,它意味着获取指针指向的"事物"。FString*
是指向FString
的指针,因此取消引用此类指针将产生FString
。
*
和->
之间的区别在于->
是 :(*pointer).
或"取消引用pointer
并访问其成员"的简写。
4)如果调用变量,为什么我们甚至需要引用或指针 也一样好吗?
想要使用指针或引用的原因可能有几个。例如,引用对象但不复制对象本身。
5)为什么有些人声称90%的变量将使用引用 和更高级别的指针?它们有什么好处吗?如果我们 只是按变量调用,不是更简单更快吗?
谁声称这一点?我没有数字,但这似乎不准确。当然,它们都是非常有用的构造,但是如果它们用于这些数字,则在很大程度上取决于项目。
x
和y
被称为左值表达式(通常缩写为左值)。这意味着它们对应于内存位置。 表达式的上下文确定是将值写入内存位置,还是从内存位置检索值。
在代码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是同一个问题,但我可能解释错了。
我希望这是清楚的。如果您有任何其他问题,请随时发表评论,我会尽力回答,我很乐意帮助本杰明的同胞!
- 何时返回指针与返回对象的一般经验法则?
- 何时使函数成为类成员函数C++?
- __unaligned说明符何时与指针一起使用?
- c++:何时传递指针与返回对象
- C 何时将指针用于向量
- 排序阵列会使指针链接错误
- C++ ->尝试逐字阅读一行文本。如何使指针等效于用于存储输入的当前二维数组
- 调整窗口内存映射文件的大小,而不会使指针失效
- 为什么或何时用指针声明int
- 使指针类型围绕其最大值
- 使指针的中间;它有效吗?
- 如何使指针指向模板化成员函数的专用变体
- 使指针常量C++
- 使指针全局C++
- 何时对对象使用 new,何时使用指针
- 如何以及何时复制指针
- 是否可以在不使指针无效的情况下调整/重新分配大块内存
- 使指针指向数组c++的开头
- 警告:指针和整型之间的比较,传递' read '的参数1使指针的整型没有强制转换
- 如何使指针指向指针NULL