Dealing with pointer argument in C

谁说胖子不能爱 提交于 2019-12-11 18:24:37

问题


I'm using a library which has a function with the following signature:

void LED_stop_blink_task ( void * callback_parameter );

The actual parameter the void pointer stands for is a pointer to uint32_t, which is the number of the led on the board.

Is there a way to call this function without using a variable to hold the data ? In my imagination it will be like

LED_stop_blink_task(&35);

or the only way is like this:

uint32_t led_num = 35;
LED_stop_blink_task(&led_num);

If you're asking why I want to throw the variable away, well, I'm just curious if it's possible...


回答1:


On most platforms it's possible to simply stuff the int in a void *:

LED_stop_blink_task((void *)32);

Then in the function you can cast to int.

An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

In practice this will work on any POSIX-supported platform. For example TLPI says:

Strictly speaking, the C standards don’t define the results of casting int to void * and vice versa. However, most C compilers permit these operations, and they produce the desired result; that is, int j == (int) ((void *) j).




回答2:


Cnicutar's answer is almost perfect; let me extend it with that it's not really portable - int is not guaranteed to be of the same size (or smaller) than a pointer, so you should use intptr_t or uintptr_t instead.



来源:https://stackoverflow.com/questions/12026427/dealing-with-pointer-argument-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!