gpt4 book ai didi

c++ - 指针如何成为右值?

转载 作者:行者123 更新时间:2023-12-03 10:04:28 24 4
gpt4 key购买 nike

#include <iostream>

void func(int*&& ptr)
{
int j = 0;
ptr = &j;
}

int main()
{
int i = 0;
std::cout << &i << std::endl;
func(&i);
std::cout << &i;
}
我知道毫无意义的程序,但我只是想学习。
预期输出:第一 cout将内存位置打印到 i第二个 cout将打印临时变量的内存位置,其中 j被存储。
实际输出:打印的两个内存位置是相同的(这意味着它没有被 func 改变)
起初,我尝试定义 func&像这样 void func(int*& ptr) .我希望这是一个左值引用,可以让我更改 i 的地址.但是,当我尝试将函数调用为 func(&i); 时,这会出错,在 & 下方带有红色摆动错误是。 initial value of a reference to non const must be an lvalue现在这是我的问题。怎么可能 &i不是左值?不是内存地址吗?这是否意味着它毫无疑问地存储在内存中的某个地方?对于我用右值引用( void func(int*&& ptr))展示的原始函数,这意味着什么?未存储在内存中的内存地址?

最佳答案

让我们抛开“绝对存储在内存中的某处”并不严格适用于 C++ 中的任何对象(这是对计算机编程的抽象,而不是实际的计算机编程!),因为这不是重点。
虽然 int以名称引用i是一个“存在于内存中某处”的对象,您使用表达式 &i 获得的临时指针不是。它是操作的未命名结果,例如 2 + 3foo() .这是一个右值表达式。

what that even mean? A memory address that isn't stored in memory?


基本上,是的。
事物的地址和事物本身是两个不同的对象。仅仅因为该事物在内存中,并不意味着代表该事物地址的事物也在内存中。
这实际上并不是一个奇怪的概念。你可以在一条街上找到你的房子,用砖头和灰泥砌成,但如果你试图找到用粉笔写在路上的邮政地址,你可能要找很长时间。
尽管如此,C++ 还是让您做到这一点:指针本身也可以成为街道上的一个结构,但需要做更多的工作。如果您分配了 &i到一个新的 int*变量,该变量的名称将是一个左值表达式。因此,您可以通过引用将该指针变量传递给 func .也许现在它是用打印机墨水写在公共(public)汽车站的告示上的。
请注意,您已经使用 int 准确地做到了这一点。 : 0是一个没有“内存地址”的右值,但是一旦你将它分配给一个具有名称( i )的变量,你就有一个左值可以使用。

表达式的值类别不是您可以“看到”的东西,因此一开始要掌握它们可能会有些困难。您首先将它们视为“可能位于 = 操作左侧的事物”,并添加了一些“带有名称的事物”。最终您会发现它们很直观,了解它们的所有细微差别,并删除稍微不准确的内存短语。与此同时,你可以随时来这里问这样的问题。 🙂

关于c++ - 指针如何成为右值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65572727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com