C语言中全局变量声明为什么可以省略元素个数的一些思考

最近在学习u-boot的源码,当我读到一条全局变量声明:

extern flash_info_t flash_info[];

我就在想c语言的编译器为什么允许声明数组变量的时候可能省略元素个数呢?或者说为什么全局数组变量声明不关系数组元素个数呢?我认为主要有以下几点原因,记录下来。

(1)声明是给编译器使用的,目的是告诉编译器在另外一个地方(内存或者外存)中定义了一个变量或者函数。在这里,是告诉编译器在其他.c源文件中定义了一个元素类型为flash_info_t的数组变量。

(2)为什么数组元素个数可以省略,或者编译器不用关心呢?我感觉这与全局变量的另外一个用途有关,就是可以在当前.c源文件中使用数组,但是大家都知道数组作为一个整体是无法直接读写的。我们只能使用数组的某个元素。在当前源文件中可以对数组某一个元素例如flash_info[i]进行读写操作。现在有一个问题就是如何找到flash_info[i]呢?是通过“基址+变址+解引用”实现的基址就是数组名,也是数组首元素的地址,变址就是i*sizeof(flash_info_t),解引用就不用说了计算机最擅长续写访问内存格子了

总之一句话,全局变量声明的时候不用传数组元素个数的真正原因是“全局变量声明的目的是指导编译器找到全局数组变量的位置(地址值,还是指针的用法),而不知访问全局数组变量”

最后,需要主要的是参数中省略数组元素个数的情况,这里是传参,已经函数定义时内存分配,而不是变量声明。

延伸一下:

如果大家学习过uboot的源码,里面有大量的指令集,而每一个指令集对应一个:U_BOOT_CMD的含参宏,宏的参数中有一个是函数指针变量,用于绑定要调用的函数例如:

类似:

int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

需要注意的是函数定义中参数是真正在函数调用的时候分配内存并传值的,也就说argc argv在这里都是变量定义,而非声明。

我的理解是这样的argc和argv两个参数共同组成了参数列表(数组)的描述,一个数组要想描述清楚需要2个要素。要素一:元素个数,要素二:是首元素的地址描述的是整个数组,因为在函数体内部会对每一个元素进行访问,而不是某一个元素)。

所以定义2个变量一个int argc用于存储元素个数,char*argv[](等效于char **argv;)定义了一个指针变量用于存储首元素的地址(类型是char *)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值