Uboot中C语言之指针数组

回顾:https://blog.****.net/wangdapao12138/article/details/79406924

1.字面意思来理解指针数组与数组指针

1)指针数组的实质是一个数组,这个数组中存储的内容全部是指针变量。

2)数组指针的实质是一个指针,这个指针指向的是一个数组

2.分析指针数组与数组指针的表达式

1)int *p[5]; int (*p)[5];    int *(p[5]);

2)一般规律:int *p;(p是一个指针); int p[5];(p是一个数组)

总结:我们在定义一个符号时,关键在于:首先要搞清楚你定义的符号是谁(第一步:找核心);其次再来看谁跟核心最近、谁跟核心结合(第二步:找结合);以后继续向外扩展(第三步:继续向外结合直到整个符号完)。

Uboot中C语言之指针数组

3)如何核心和*结合,表示核心是指针;如果核心和[]结合,表示核心是数组;如果核心和()结合,表示核心是函数。

4)用一般规律来分析3个符号:

    第一个:int *p[5]; 核心是p,p是一个数组,数组有5个元素大,数组中的元素都是指针,指针指向的元素类型是int类型的;整个符号是一个指针数组。

    第二个,int (*p)[5];核心是p,p是一个指针,指针指向一个数组,数组有5个元素,数组中存的元素是int类型; 总结一下整个符号的意义就是数组指针。

    第三个,int *(p[5]); 解析方法和结论和第一个相同,()在这里是可有可无的。

下面是代码部分:

typedef int (init_fnc_t) (void);

/*这里定义了一个新的数据类型init_fnc_t,

*这个数据类型是参数为空,返回值为int的函数。PS:注意init_fnc_t并不是函数指针!!! 如果这样写就表示函数指针 typedef int (*init_fnc_t) (void);
*/

/*init_sequence是一个指针数组,数组元素指向的是init_fnc_t类型的函数*/

//init_sequence 是一个指针数组(数组元素为指针变量),指向的是init_fnc_t类型的函数组成的数组。数组的元素数据类型 init_fnc_t是参数为空,返回值为int的函数)
init_fnc_t *init_sequence[]=

我们来解析下这句话。对照int *p[5],我们知道init_sequence是一个指针,指向一个数组,数组元素是init_fnc_t类型的。

{
     cpu_init, /* basic cpu dependent setup */
基本的处理器相关配置 -- 
     board_init, /* basic board dependent setup */
基本的板级相关配置 -- 
     interrupt_init, /* set up exceptions */
初始化中断处理 -- 
     env_init, /* initialize environment */
初始化环境变量
     init_baudrate, /* initialze baudrate settings */
初始化波特率设置
     serial_init, /* serial communications setup */
初始化串口通讯设置
     console_init_f, /* stage 1 init of console */
控制台初始化阶段1
     display_banner, /* say that we are here */
打印u-boot信息
     dram_init, /* configure available RAM banks */
RAM banks 配置可用的RAM
     display_dram_config,
//显示RAM的配置大小
#if defined(CONFIG_VCMA9)|| defined(CONFIG_CMC_PU2)
     checkboard,
#endif
NULL,
};

/*init_fnc_ptr为指向函数指针的指针*/
    init_fnc_t **init_fnc_ptr;
/*init_fnc_ptr初始化指向init_sequence指针数组,下面的循环遇到NULL结束*/
    for (init_fnc_ptr= init_sequence;*init_fnc_ptr;++init_fnc_ptr)

    {
        if ((*init_fnc_ptr)()!= 0)

        {

           /*(*init_fnc_ptr)()为C中调用指针指向的函数*/
            hang ();
        }
    }

PS:指针数组和指向指针的指针 两者的主要区别:

就是,指针数组的数组名不能进行++操作(因为数组名仅仅代表一个地址!是一个常量!!),而指向指针的指针是 可以++的(因为它是一个变量!),所以这段源代码中,重新定义了一个指向函数指针的指针init_fnc_ptr来对指针数组 (init_sequence)进行操作. 操作也就是将各个准备初始化的函数的入口地址依次赋给init_fnc_ptr!而*init_fnc_ptr就正好对应arch_cpu_init这些 东西了,那么(*init_fnc_ptr)()就相当于arch_cpu_init() 了.

Uboot中C语言之指针数组Uboot中C语言之指针数组