*((int *)arg)做什么?

时间:2016-11-19 23:30:29

标签: c pointers casting type-conversion

我不熟悉用于描述event的术语,因此我无法成功Google查询该主题,以便了解更多信息;我也未能在SO上找到任何东西。

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

*((int *) arg)

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); ... } 做什么以及这种现象叫做什么?感谢。

4 个答案:

答案 0 :(得分:2)

它将指针取消引用*some_pointer和转换(some_type)some_value_with_some_other_type结合起来。这样做基本上是“Hey C编译器,我知道你认为这是一个void*,但我认为它应该是一个int*,你可以这样对待吗?哦,当你是在它,给我int指针指向“。

答案 1 :(得分: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)

答案 2 :(得分:1)

它读取整数类型' int'来自指针变量' arg'中的内存地址。 '(int *)'是一个类型转换,以便编译器将位重新解释为指向int的指针而不是指向void的指针。

答案 3 :(得分:1)

arg判断我认为指针将保存一个指向函数的指针,这种技术在Linux中使用很多,你应该寻找的是callbacks这些被调用的函数具体条件和程序员经常声明一个变量,它包含一个回调的通用原型(在你的情况下是一个接受一个整数的指针)并根据事件为该指针分配一个回调,然后在需要时调用它。 p>

相关问题