循环中的双指针

时间:2011-05-27 07:01:00

标签: c pointers

对于以下示例(来自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循环将退出?

4 个答案:

答案 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 ;