C语言_二级指针用法

typedef int (init_fnc_t) (void); //定义了一个函数
init_fnc_t **init_fnc_ptr;  //定义了一个指向init_fnc_t类型的二重函数指针
//二重指针的作用有2个,一个是用来指向指针数组,一个是用来指向一重指针

init_fnc_t *init_sequence[] = {
	cpu_init,		
#if defined(CONFIG_SKIP_RELOCATE_UBOOT)
	reloc_init,		
#endif
	board_init,		
	interrupt_init,		
	env_init,		
	init_baudrate,		
	serial_init,		
	console_init_f,		
	display_banner,		
#if defined(CONFIG_DISPLAY_CPUINFO)
	print_cpuinfo,		
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
	checkboard,		
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
	init_func_i2c,
#endif
	dram_init,		
	display_dram_config,
	NULL,
}; //定义了一个函数指针数组

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
		if ((*init_fnc_ptr)() != 0) {
			hang ();
		}
	}
/* 
for循环执行init_sequence
(1)init_sequence是一个函数指针数组,数组中存储了很多个函数指针,这些指向指向的函数都是init_fnc_t类型(特征是接收参数是void类型,返回值是int)。
(2)init_sequence在定义时就同时给了初始化,初始化的函数指针都是一些函数名。(C语言高级专题中讲过:函数名的实质)
(3)init_fnc_ptr是一个二重函数指针,可以指向init_sequence这个函数指针数组。
(4)用for循环肯定是想要去遍历这个函数指针数组(遍历的目的也是去依次执行这个函数指针数组中的所有函数)。思考:如何遍历一个函数指针数组?有2种方法:第一种也是最常用的一种,用下标去遍历,用数组元素个数来截至。第二种不常用,但是也可以。就是在数组的有效元素末尾放一个标志,依次遍历到标准处即可截至(有点类似字符串的思路)。
我们这里使用了第二种思路。因为数组中存的全是函数指针,因此我们选用了NULL来作为标志。我们遍历时从开头依次进行,直到看到NULL标志截至。这种方法的优势是不用事先统计数组有多少个元素。
(5)init_fnc_t的这些函数的返回值定义方式一样的,都是:函数执行正确时返回0,不正确时返回-1.所以我们在遍历时去检查函数返回值,如果遍历中有一个函数返回值不等于0则hang()挂起。从分析hang函数可知:uboot启动过程中初始化板级硬件时不能出任何错误,只要有一个错误整个启动就终止,除了重启开发板没有任何办法。
(6)init_sequence中的这些函数,都是board级别的各种硬件初始化。
*/

你可能感兴趣的:(C语言)