我正在使用一个具有以下签名功能的库:
void LED_stop_blink_task ( void * callback_parameter );
void指针代表的实际参数是指向uint32_t的指针,它是板上led的编号。
有没有办法在不使用变量来保存数据的情况下调用此函数? 在我的想象中它会像
LED_stop_blink_task(&35);
或唯一的方法是这样的:
uint32_t led_num = 35;
LED_stop_blink_task(&led_num);
如果你问我为什么要抛弃变量,那么,我只是好奇它是否可能......
答案 0 :(得分:4)
在大多数平台上,只需将int
填入void *
:
LED_stop_blink_task((void *)32);
然后在函数中你可以转换为int
。
整数可以转换为任何指针类型。除了 以前指定的,结果是实现 - 定义,可能不是 正确对齐,可能不指向引用的实体 类型,可能是陷阱表示。
任何指针类型都可以转换为整数类型。除了 以前指定的,结果是实现定义。如果 结果不能用整数类型表示,行为是 理解过程科幻定义。结果不必在任何整数的值范围内 类型。
实际上,这适用于任何支持POSIX的平台。例如,TLPI说:
严格地说,C标准没有定义铸造的结果 int to void *,反之亦然。但是,大多数C编译器允许这些 操作,他们产生了预期的结果;也就是说,int j == (int)((void *)j)。
答案 1 :(得分:1)
Cnicutar的答案几乎是完美的;让我扩展它,因为它不是真正可移植的 - int不能保证与指针的大小(或更小)相同,所以你应该使用intptr_t
或uintptr_t
代替。