我如何理解 &*(x+i)?
How can i understand &*(x+i)?
这是 c++ 代码:
x[5]={1,2,3,4,5};
&x[i]==&*(x+i)==x+i;
至于&*(x+i)
,在我看来,*(x+i)
是一个右值,为什么要使用&
。为什么?
shell &x[i]==&*(x+i)==x+i;
这一行向您展示了获取数组特定元素地址的 3 种不同方法。
在您的情况下,有一个数组x
存储 5 个值。第一件事可能看起来有点熟悉。 x[i]
将获取x
的第i
个元素,通过使用运算符的地址,您将获得i
-th元素的地址。
让我们继续第三个语句x+i
。由于x
实际上只是一个指向存储中实际数组的第一个元素的地址的指针,因此您可以通过向x
添加偏移量来获取其他元素的地址。但是,由于您使用的是x
地址,因此您不会获得"偏移"元素的值,而是其地址。要获取该值,您需要使用神奇的*
取消对地址的引用。因此,如果&x[i]
获得第 i
个元素的地址并且x+i
做同样的事情,*(x+i)
将执行与x[i]
相同的操作。它将获得x
的第i
个值。
不,您知道操作者的地址&
和去引用操作员*
什么.第二种说法相当简单。 (x+i)
将获取第 i
个元素的地址。 *(x+i)
将通过取消引用地址来获取值,&*(x+i)
将获得取消围栏地址的地址。所以第二句话和写x+i
是一样的。
但是,解释的行可能会给您一个编译器错误,因为它应该更像这样:(&x[i]) == (&*(x+i)) && (&x[i]) == (x+i);
结论:所有这些事情都做同样的事情,但略有不同。
假设我们有这段代码
int i = 0;
int x[5]={1,2,3,4,5};
那么这个比较是正确的:
&x[i] == &*(x+i)
出于类似的原因,这种比较也是正确的。
&*(x+i) == x+i;
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++,我收到一个无法理解的编译器错误
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 理解c++中的引用
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Python中的for循环与C++有何不同
- 通过实例理解std::move及其目的
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 试图理解类对象的行为
- 难以理解某些人解决IOI问题的源代码
- 有人能帮我理解这个c++代码吗
- 理解循环C++中的循环
- 理解这行C++指针代码
- 理解GCC中的std::pow实现
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 如何理解新的运算符重载?
- 为什么理解这个递归示例如此难以转化为直觉?
- 我正在尝试理解代码块中的这些错误
- 在C++中释放内存期间,迭代器与指针有何不同