【问题标题】:Decoding declaration(a combination of array and function pointers) in C [closed]C中的解码声明(数组和函数指针的组合)[关闭]
【发布时间】:2018-12-28 07:58:22
【问题描述】:

我有这段代码:

(*I_dont_know ())[(int) ((*ptr))]

I_dont_know(), a function which takes void and returns a pointer.
ptr is an integer pointer.

据我所知[(int)((*ptr))] ---> ptr 是一个返回整数的函数指针,其余我没有得到。有人可以解释一下吗?

【问题讨论】:

  • 什么是I_dont_knowptr
  • 片段无法编译。这使得任何人都无法帮助您解码它——我们不知道它应该是什么。您必须提供 MCVE (minimal reproducible example)! (什么是“I_dont_know”和ptr,分号在哪里,这是在全局范围内还是在函数内部?)
  • 如果有人问我c中的int a是什么意思,我会简单地回答a是整数类型的变量。 @Fei 我不会哭,因为我不知道什么是 a。
  • @JonathanLeffler。如果有人像我一样,什么是 (int)(*func) (int)。我将简单地回答,因为 func 是一个指向函数的指针,它以一个整数作为参数并返回一个整数而不是说 blah blah blah ...
  • 好吧,既然(int)(*func)(int) 可以编译——加上分号——我可以毫无问题地解释在指向函数的指针的返回类型周围有一组冗余括号单个 int 参数并返回 int 值。在标准 C(C90、C99、C11、C17)中,显示的代码无法编译,即使在末尾添加了分号。它当然需要更多的上下文来显示正在发生的事情。如果ptr 被声明为int (*ptr)();,那么你对[(int)((*ptr))] 的分析是不正确的——像这样取消引用函数指针是无效的。

标签: c arrays function-pointers


【解决方案1】:

该代码不是声明,但可以解释为表达式。

(*I_dont_know())[(int) ((*ptr))]
  1. 不带参数调用函数I_dont_know。这个函数返回一个指向某物的指针。
  2. 取消引用返回的指针以获取某个对象。
  3. 同时,取消引用 ptr 的值并将其转换为 int 值。
  4. 然后将int 值作为[](索引)运算符的参数传递给在步骤2 中返回的该对象。在C 中,这可能是另一个指针或数组(数组也衰减为指针)。在 C++ 中,这也可以是重载了 [] 运算符的对象。
  5. 由于此表达式不在赋值的左侧,因此将返回从[] 运算符子表达式返回的值(即数组中*ptr-index 处的元素)。

假设这是 C,那么索引运算符的参数应该转换为 size_t 而不是 int。如果是 C++,那么只有在 [] 运算符重载专门接受 int 参数操作数时,才应将其强制转换为 int

【讨论】:

  • C 没有重载运算符;它必须是本机数组。我认为函数I_dont_know() 必须返回一个指向指针的指针,因为您在 LHS 上取消引用它一次,第二次使用下标取消引用。但在基本分析上做得很好。我会注意到你不应该像你所做的那样进行推断。我还观察到问题认为这是一个声明,原因尚不清楚。作为声明,它根本无法编译。它也需要大量上下文才能编译为表达式。
  • @JonathanLeffler 谢谢你的夸奖。我忘记了 OP 只询问 C 而不是 C++。我现在已经修改了我的答案,使其针对 C 并且向 C++ 致敬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多