Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
初学者问题:C++;指针/地址-&;变量之后不是之前? 我是一个生疏的业余C++程序员,经过一段时间后,从OpenGL 2转到Vulkan。_C++_Pointers_Memory Address - Fatal编程技术网

初学者问题:C++;指针/地址-&;变量之后不是之前? 我是一个生疏的业余C++程序员,经过一段时间后,从OpenGL 2转到Vulkan。

初学者问题:C++;指针/地址-&;变量之后不是之前? 我是一个生疏的业余C++程序员,经过一段时间后,从OpenGL 2转到Vulkan。,c++,pointers,memory-address,C++,Pointers,Memory Address,我试图理解我正在阅读的教程背后的代码,不仅仅是抄袭,还不理解以下部分的&: catch (const std::exception& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; } 这与将常量引用“exception”绑定到临时对象“e”有关吗 正如你所看到的,我试图研究/谷歌它,但并不完全理解它或为什么 任何帮助都将不胜感激。&根据上下文有不同的含义。在声明中,它表

我试图理解我正在阅读的教程背后的代码,不仅仅是抄袭,还不理解以下部分的&

catch (const std::exception& e) {
    std::cerr << e.what() << std::endl;
    return EXIT_FAILURE;
}
这与将常量引用“exception”绑定到临时对象“e”有关吗

正如你所看到的,我试图研究/谷歌它,但并不完全理解它或为什么


任何帮助都将不胜感激。

&
根据上下文有不同的含义。在声明中,它表示对的引用。e、 g

int a = 42;
int &b = a;  // b is a reference to a 
             // b is essentially an alias of a (they both have the same address, for example)
             // i.e. changes to b will be reflected in a, and vice versa
int a = 42;
int *b = &a; // b points to a (i.e. b holds the address of a).
这里有一些更深入的解释

当对已经存在的变量使用
&
时,这意味着
的地址。e、 g

int a = 42;
int &b = a;  // b is a reference to a 
             // b is essentially an alias of a (they both have the same address, for example)
             // i.e. changes to b will be reflected in a, and vice versa
int a = 42;
int *b = &a; // b points to a (i.e. b holds the address of a).
因此,在您的示例中,
e
是对传入的任何异常的常量引用(因为函数的参数声明了一个变量)。

类似问题:

int* pintVar;
“为什么在int之后是*呢?间接运算符在那里做什么?为什么不在变量名之前,比如在这里?”

嗯,你看*符号有多重含义。也许您已经理解了这一点:在复合类型名称中,它表示指针类型。在表达式中,它表示运算符。它可以是一元间接运算符(
*pintVar
)或二进制乘法运算符(
a*b

以完全相同的方式,&symbol具有多重含义。在复合类型名称中,它表示引用类型。在表达式中,它表示运算符。它可以是运算符的一元地址(
&intVar
)或二进制位AND运算符(
a&b


所以,
const T&
是对const T的引用,就像
const T*
是指向const T的指针一样

引用和指针都是间接寻址的形式,而且都非常简单。它们的区别是:

  • 指针是对象,引用不是对象
    • 因为引用不是对象,所以无法获取引用的地址,也不存在指向引用的指针或指向引用的引用
    • 也没有引用数组
  • 可以指定一个(非常量)指针指向另一个对象。引用在其整个生命周期中绑定到单个对象
  • 指针可以为空,引用不能为空
  • 必须使用间接运算符显式间接通过指针。引用上的所有操作都通过引用隐式间接执行,并改为应用于引用的对象。
    • 引用的赋值就是引用对象的赋值
    • 获取引用变量的地址就是获取引用对象的地址
  • 指针是数组的迭代器;您可以使用指针算术来迭代元素。将一个指针添加到一个指针将导致指向后续数组元素的指针。没有参考算法。由于隐式间接寻址,将一个添加到引用会将一个添加到引用的对象

这与将常量引用“exception”绑定到临时对象“e”有关吗

这里有很多正确的词语,但我不明白你想说的是什么意思


e
是一个变量。变量的类型是
const std::exception&
,即引用常量exception。抛出时,引用绑定到抛出的异常对象。

它声明了一个引用类型的变量。任何一本C++基础书籍都应该解释这个,它是类型系统的一个重要部分,在这种情况下,它不表示指针,而是引用,这意味着可以将值传递到该函数中,即使在函数未返回函数时它也会更新值,这样就好像传递指针到函数一样,但是类型是由声明定义的。您是否要求a)解释为什么
&
位于
std::exception
的右侧而不是左侧或b)您是否询问
&
的意思或c)您询问的是a)和b)这是一个很好的答案,但事实上它没有解释参考文献。添加了更多的解释。考虑到@Ben是个生疏的业余爱好者,在你的解释中使用
l-value
可能不合适。我认为对<>代码> L值<代码>的简单解释已经到位(也许是指任何人都感兴趣的更技术的解释),或者完全省略<代码> L值<代码>,并用外行术语来解释它。业余爱好者自学的C++,生锈的编程VBA已经有6年了。理解函数中的引用和vba的ByRef的相似之处(在我的头脑中,无论如何是D)。由于const声明,在异常之后获取(&F)。现在查找1值。为信息人干杯,真的很有用。@Ben Great,很高兴它有帮助:)