C语言中指针参数的处理

C语言中指针参数的处理,c,pointers,function-parameter,C,Pointers,Function Parameter,我使用的库具有以下签名的函数: void LED_stop_blink_task ( void * callback_parameter ); void指针代表的实际参数是一个指向uint32_t的指针,uint32_t是板上led的编号 有没有一种方法可以在不使用变量保存数据的情况下调用此函数? 在我的想象中,会是这样 LED_stop_blink_task(&35); 或者唯一的办法是这样的: uint32_t led_num = 35; LED_stop_blink_task(

我使用的库具有以下签名的函数:

void LED_stop_blink_task ( void * callback_parameter );
void指针代表的实际参数是一个指向uint32_t的指针,uint32_t是板上led的编号

有没有一种方法可以在不使用变量保存数据的情况下调用此函数? 在我的想象中,会是这样

LED_stop_blink_task(&35);
或者唯一的办法是这样的:

uint32_t led_num = 35;
LED_stop_blink_task(&led_num);

如果你问我为什么要扔掉这个变量,那么,我只是好奇是否有可能…

在大多数平台上,可以简单地将
int
填充在
void*
中:

LED_stop_blink_task((void *)32);
然后在函数中可以强制转换为
int

整数可以转换为任何指针类型。除了作为 先前规定的结果是实施已确定,但可能没有 如果正确对齐,则可能不会指向引用对象的实体 类型,并且可能是陷阱表示形式

任何指针类型都可以转换为整数类型。除了作为 先前规定的结果是实施定义。如果 无法在整数类型中表示结果,行为为 未定义。结果不必在任何整数的值范围内 类型

实际上,这将在任何POSIX支持的平台上工作。例如,TLPI说:

严格地说,C标准没有定义铸造的结果 int表示无效*,反之亦然。然而,大多数C编译器都允许这样做 操作,并产生预期的结果;即int j== (int)((void*)j)


在大多数平台上,可以简单地将
int
填充到
void*
中:

LED_stop_blink_task((void *)32);
然后在函数中可以强制转换为
int

整数可以转换为任何指针类型。除了作为 先前规定的结果是实施已确定,但可能没有 如果正确对齐,则可能不会指向引用对象的实体 类型,并且可能是陷阱表示形式

任何指针类型都可以转换为整数类型。除了作为 先前规定的结果是实施定义。如果 无法在整数类型中表示结果,行为为 未定义。结果不必在任何整数的值范围内 类型

实际上,这将在任何POSIX支持的平台上工作。例如,TLPI说:

严格地说,C标准没有定义铸造的结果 int表示无效*,反之亦然。然而,大多数C编译器都允许这样做 操作,并产生预期的结果;即int j== (int)((void*)j)


Cnicutar的答案几乎是完美的;让我扩展一下,它不是真正的可移植性-int不能保证与指针大小相同(或更小),因此您应该使用
intptr\t
uintptr\t
;让我扩展一下,它不是真正可移植的-int不能保证与指针大小相同(或更小),所以你应该使用
intptr\t
uintptr\t

@Mellowcandle不太好,请看我的答案。@Mellowcandle我倾向于相信Michael Kerrisk:-)好的,这是一种方法,但是如果我不能访问函数的内部,如果只有库的原型呢?@Mellowcandle在这种情况下,你的手被函数解释你的论点的方式束缚住了。@Mellowcandle不太好,请看我的答案。@Mellowcandle我倾向于相信Michael Kerrisk:-)好的,这是一种方式,但是如果我不能访问函数的内部,如果只有库的原型呢?@Mellowcandle在这种情况下,函数解释你的论点的方式会束缚你的手脚。