(ptr + i)->Func() 和 &ptr[i] 之间有什么区别吗?Func()
Is there any difference between (ptr + i)->Func() and &ptr[i].Func()
或者两者相等?ptr是指向结构数组的指针。
UPD:感谢大家的回复。对不起,我把语法拼错了。我想比较的是(ptr + i)->Func()
和(&ptr[i])->Func()
。我对&
运算符感到困惑,因为它应该返回变量的地址。这不是又导致了一次获取该地址的操作吗?
(ptr + i)->Func()
等效于ptr[i].Func()
。
由于运算符的优先级,&ptr[i].Func()
等效于&(ptr[i].Func())
,也就是说,它取Func()
的返回值的地址。
没有区别。CCD_ 9被标准保证为完全等同于CCD_。前者通常更容易阅读。
您可能是指&ptr[i]->Func()
,否则您的表达式就没有相同的功能。
根据C++标准,将指针类型的值添加到积分类型的值会在等于积分类型值的偏移量处产生与原始指针类型相同的指针。取地址ptr[offset]
产生相同的值,因此两者是相同的。此外,添加的顺序无关紧要,因此下面的所有表达式都做同样的事情,并且应该产生相同的可执行代码:
&ptr[i]
(ptr+i)
(i+ptr)
&(i[ptr]) // <<== Don't do this!
最后一件物品只是作为一种好奇。不要在编程谜题之外的代码中使用此构造。
我假设结构或类具有Func函数。因此,通过地址访问函数和访问字段是一样的。在我看来,这只是解决算术上的差异。所以他们两个是平等的。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 不能在 if 语句 - c++ 中使用 void func 直接将字符串转换为大写
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- 在扣除自动之前使用decltype(auto) <func>
- Understanding void func(A())
- C++中的指针否定 (!ptr == NULL)
- (ptr + i)->Func() 和 &ptr[i] 之间有什么区别吗?Func()
- 这个语句表示什么[func ptr]