c++ - 在 C/C++ 中,对于数组 a,我刚刚了解到 (void*)&a == (void*)a。这是如何运作的?

标签 c++ c arrays pointers

所以,我一直都知道在 C/C++ 中传递的数组“对象”只包含数组中第一个对象的地址。

指向数组“对象”的指针和它包含的值如何相同?

有人可以向我指出更多信息,也许是关于组装中的所有工作原理。

最佳答案

简答:指向数组的指针被定义为与指向数组第一个元素的指针具有相同的值。这就是 C 和 C++ 中数组的工作原理。

学究式的回答:

C 和 C++ 有 rvaluelvalue 表达式。左值是&可以应用运算符。它们也有隐式转换。一个对象在被使用之前可能会被转换成另一种类型。 (例如,如果您调用 sqrt( 9 ),则 9 将转换为 double,因为未定义 sqrt( int )。)

数组类型的左值隐式转换为指针。隐式转换更改array&array[0] .这也可以明确写成 static_cast< int * >( array ) , 在 C++ 中。

这样做没问题。投给 void*是另一个故事。 void*有点难看。并将括号转换为 (void*)array也很丑。所以请避免(void*) a在实际代码中。

关于c++ - 在 C/C++ 中,对于数组 a,我刚刚了解到 (void*)&a == (void*)a。这是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13557736/

相关文章:

c++ - 为什么模板 <typename...> 不被识别为可通过模板 <template<typename> typename> 实例化?

c++ - 模板函数中的多态性

C++ 对数组位置使用 bool 值评估(跳转表)

无法解释 C 中简单字符串操作的输出

c - 将可分配数组从 fortran 传递到 C 并对其进行 malloc

c++ - 在 VBA 中模仿 std::map<string, std::list<string>>

c++ - 如何在 Visual Studio 中更改 C++ 标准库实现

python - 需要一个工具来检测 C 代码中变量的类型

arrays - MongoDB - 从数组中提取多个对象

arrays - 如何将数组/列表添加到对象