【问题标题】:What does *((int *) arg) do?*((int *) arg) 有什么作用?
【发布时间】:2016-11-19 23:30:28
【问题描述】:

我不熟悉描述*((int *) arg) 的术语,因此我无法成功地通过谷歌查询该主题以了解更多信息;我也没有成功在这里找到任何东西。

这是来自The Linux Programming Interface的代码片段:

static void *threadFunc(void *arg)
{
   int loops = *((int *) arg)
   ...
}

int main(int argc, char *argv[])
{
   pthread_t t1;
   int loops, s;

   loops = (argc > 1) ? getInt(argv[1], GN_GT_0, "num-loops") : 10000000;
   s = pthread_create(&t1, NULL, threadFunc, &loops);
   ...
}

int loops = *((int *) arg) 在做什么?这种现象叫什么?谢谢。

【问题讨论】:

  • 您将 void* 转换为 int* 然后取消引用它?

标签: c pointers casting type-conversion


【解决方案1】:

它结合了指针解引用*some_pointer 和转换(some_type)some_value_with_some_other_type。这基本上是“嘿C编译器,我知道你认为这是一个void*,但我认为它应该是一个int*,你能这样对待它吗?哦,当你在它的时候,给我是指针指向的int”。

【讨论】:

  • 类似对话的引用是一个好方法;谢谢。现在完全有道理。
【解决方案2】:

arg是一个指针,存储int类型变量的地址

s = pthread_create(&t1, NULL, threadFunc, &loops);
                                          ^^^^^^

但是在函数 threadFunc 中,它被声明为具有类型 void * 而不是 int *

static void *threadFunc(void *arg)
                        ^^^^^^^^^

因此在这个表达式中

int loops = *((int *) arg)

最初的指针再次被解释为int *类型的指针

(int *) arg

然后取消引用以获取它指向的对象

*((int *) arg)

【讨论】:

  • 所以基本上我们通过threadFunc()传递loops的地址。在threadFunc() 的开头,arg 只是一个指向loops 地址的空指针。然后我们将argvoid * 转换为int *,然后引用arg 以获得loops 的int 值?听起来对吗?
【解决方案3】:

它从指针变量'arg'的内存地址中读取'int'类型的整数。 '(int *)' 是一种类型转换,因此编译器将这些位重新解释为指向 int 的指针而不是指向 void 的指针。

【讨论】:

    【解决方案4】:

    arg 来看,我假设指针将保存指向函数的指针,这种技术在 Linux 中被大量使用,您可能应该寻找的是 callbacks,它们是在特定条件下调用的函数,并且程序员经常声明一个变量,该变量包含一个回调的通用原型(在您的情况下,它接受一个指向整数的指针)并根据事件为该指针分配一个回调,然后在需要时调用它。

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多