这个指针在这个函数的参数中做了什么?

abd*_*man 1 c pointers

我是一个电子产品的人,请好好对待我.

我读到一篇关于实时操作系统的8位微控制器.我遇到了一个奇怪的观点,我遇到了这个函数.我无法理解它在做什么.我知道这void意味着"没有类型".我猜这(*Task)是铸造.我真的不知道那之后那些括号是做什么的.

这个函数的论点包括什么?

另外,我无法理解做*(int*)((NewTCB->Stack) + (STACK_DEPTH-2)) = (int)Task;什么?

在此输入图像描述

Eva*_*ran 7

void (*Task)()实际上是一个函数指针.基本上它是说:"参数名称是Task,它是一个返回的函数void和(因为这是c而不是c ++)需要任意数量的参数.

所以你可以这样称呼它:

void my_task() {
    /* do something */
}

TaskCreate(my_task);
Run Code Online (Sandbox Code Playgroud)

当然,写作也是安全的void my_task(void) {.编码c时,我个人更喜欢明确说"没有参数"

最后,*(int*)((NewTCB->Stack) + (STACK_DEPTH-2)) = (int)Task;正在做一些施法魔法.

让我们来区分它:

(int)Task首先转换Taskint(这是有问题的,但可能对你的特定架构/操作系统没问题.就个人而言,我会使用a long来保证安全).

((NewTCB->Stack) + (STACK_DEPTH-2))只是做一些简单的算术NewTCB->Stack来获得指向TCB堆栈中位置的指针.

*(int*)说"将其转换为a int *然后deference(读取或写入)它指向的位置.

我们可以更简单地写这个如下:

int f = (int)Task;
int s = ((NewTCB->Stack) + (STACK_DEPTH-2)); /* I don't know the type of `NewTCB->Stack`, so we'll pretend 'int' for now */
int *stack_ptr = (int*)s;
*stack_ptr = f;
Run Code Online (Sandbox Code Playgroud)

这可能更清楚.

关注:我想指出我如何使用倾向于使用函数指针,因为语法有时会有点混乱.我发现这种方法非常有用.基本上我喜欢typedef为函数指针创建一个并使用它,我发现它更容易正确:

例如:

/* typedef func_t to be a pointer to a function taking no arguments and returning void */
typedef void (*func_t)(void); 
Run Code Online (Sandbox Code Playgroud)

然后......

void CreateTask(func_t task) {
    /* same work as your example, just a little easier to read */
}
Run Code Online (Sandbox Code Playgroud)