初学者问题:C++指针/地址 - 和变量之后不是以前?



我是一个生疏的业余C++程序员,经过一段时间后回来,从OpenGL 2.0转向Vulkan。

我试图理解我正在阅读的教程背后的代码,而不仅仅是复制,但不理解以下内容的部分内容:

catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return EXIT_FAILURE;
}

为什么&之后是例外?我的理解是指针通常在变量之后,地址在它之前,例如:

int* pintVar;
pintVar = &intVar;

这与将常量引用">异常"绑定到临时对象">e"有关吗?

如您所见,我正在尝试研究/谷歌它,但并不完全理解它或为什么。

任何帮助将不胜感激。

&

根据上下文有不同的含义。在声明中,它表示reference to.例如

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

这里有一些参考资料可以更深入地解释这一点。

&用于已经存在的变量时,这意味着address-of.

例如
int a = 42;
int *b = &a; // b points to a (i.e. b holds the address of a).

因此,在您的示例中,e是对传入的任何异常的常量引用(因为函数的参数声明了一个变量(。

类似的问题:

int* pintVar;

"为什么 * 在 int 之后?间接寻址运算符在那里做什么?为什么它不在变量名称之前,例如此处?

int intVar = *pintVar;

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

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


因此,const T&是对常量 T 的引用,就像const T*是指向常量 T 的指针一样。

引用和指针都是间接形式,并且非常微笑。它们的区别是:

  • 指针是对象,引用不是对象
    • 因为引用不是对象,所以没有办法获取引用的地址,也没有指向引用的指针或对引用的引用之类的东西。
    • 也没有引用数组。
  • 可以分配一个(非常量(指针来指向另一个对象。引用在其整个生存期内绑定到单个对象。
  • 指针可以为空,引用不能为空。
  • 必须使用间接寻址运算符显式通过指针进行间接化。对引用的所有操作都通过引用隐式间接,并改为应用于引用的对象。 引用
    • 的分配是引用对象的分配。
    • 获取引用
    • 变量的地址就是获取引用对象的地址。
  • 指针是数组的迭代器;您可以执行指针算术来迭代元素。将 1 添加到指针会产生指向连续数组元素的指针。没有参考算术。由于隐式间接寻址,向引用添加一个会将一个添加到引用的对象。

这与将常量引用"异常"绑定到临时对象"e"有关吗?

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

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

最新更新