对于以下示例(来自mysql源代码),它使用Field **字段。我很难将其视为Field的二维数组。
typedef struct st_table_share
{
.......
Field **field;
....
}
for (Field **field=table->field ; *field ; field++)
{
...
我能以这种方式思考,一个表包含许多行,一行包含多个列/字段。所以*字段表示一行,**字段表示一个表?
如果这是真的,对于以下代码
for (Field **field=table->field ; *field ; field++)
当* field为null时它将退出,因此如果* field是一行,* field如何为null。或者我可以说如果一行有5列,而field是第一列,则field + 4是最后一列,而field + 5是列的结尾,这意味着null,因此for循环将退出?
答案 0 :(得分:4)
所以
*field
表示一行,**field
表示一个表?
在声明语法中,是的。
如果
,*field
是一行*field
如何为空?
如果代码的作者注意保留field
由空指针终止的不变量,就像使用argv
一样。即, n 行的表是 n +1指针的数组,其中最后一个必须始终为空。这是一种常见的C约定,它不需要显式计数。
答案 1 :(得分:1)
你确定Field **
是一个二维数组吗?
类型Field **
的变量不一定代表字段的二维数组。它可以是指向Fields的一维指针数组的指针。存储指针数组可能比存储结构数组更方便,原因如下:您可以单独为结构分配内存,不必使用memcpy将结构添加到列表中,某些列表操作将更便宜。实际上,这是在libusb中完成的,其中libusb_device **
类型的变量表示usb设备的(一维)列表。
答案 2 :(得分:0)
循环将继续,直到“* field”为空。即数组末尾应该有一个空终止符(一个不存在的行)。
答案 3 :(得分:0)
或者我可以说一行是否有5列,而field是第一列,则field + 4是最后一列
是的,但是,你可以这么说
和字段+ 5是列的结尾,表示空
仅当您将数组初始化为空终止时。
如果你知道你的表有多少列,你可以迭代直到到达最后一列,而不是; *field ;
。