初学者问题: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,很高兴它有帮助:)