定义了一个函数类型 init_fnc_t :
typedef int (init_fnc_t) (void);
定义了一个二重函数指针:
init_fnc_t **init_fnc_ptr;
二重指针的作用:
- 指向一重指针
- 指向指针数组(数组本质就是指针,两个差不多,只是表现形式不同)
下面定义了一个 函数指针数组init_fnc_t *init_sequence[] :
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
NULL,
};
函数指针数组分析:
- 这是个数组,数组里存放的是函数指针,函数指针指向函数
- 因为函数名即为函数首地址,也就是函数指针,所以里面直接存放函数名
分析:
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
{
if ((*init_fnc_ptr)() != 0)
{
hang ();
}
}
1.init_fnc_ptr = init_sequence 在这里,二重指针init_fnc_ptr指向了函数指针数组init_sequence(第二种用法
2. * init_fnc_ptr 在这里等同于*init_fnc_ptr== NULL,*init_fnc_ptr即代表函数指针数组init_sequence里面的元素,即从函数cpu_init开始的多个函数
3. 这个for循环目的是遍历数组 init_sequence,检查每个函数的返回值,不等于0则调用hang()函数
void hang(void)
{
/* if board_hang() returns, hange here */
printf("X-Loader hangs\n");
for (;;);
}