2013-02-09 66 views
1

我读过由Kernigan & Ritchie编写的“C编程语言”第二版的第6.3段。NULL指针作为数组末尾的标记

一些结构:

struct key { 
    char *word; 
    int count; 
} keytab[NKEYS] { 
    { "auto", 0 }, 
    { "break", 0 }, 
    { "case", 0 }, 
    { "char", 0 }, 
    { "const", 0 }, 
    { "continue", 0 } 
    }; 

作者写道一下:

数量NKEYS是密钥表关键字的数量。虽然我们 可以手动计算,但通过 机器可以更容易和更安全,特别是如果列表可能会更改。 一种可能性 将是用空指针终止初始值设定项列表, 然后沿keytab循环,直到找到结尾为止。如果枚举只包含指针

一切都将是明确的:

struct key { 
    char *word; 
    char *description; 
} keytab[NKEYS] { 
    { "auto", "" }, 
    { "break", "" }, 
    { "case", "" }, 
    { "char", "" }, 
    { "const", "" }, 
    { "continue", "" } 
    { NULL, NULL} 
    }; 

但每个记录不仅指针,但和int了。如果我对作者理解正确,那么最后一条记录必须如下:

{ NULL, ? } 

那么无指针呢?

我怎样才能解决它的枚举,其中不包含指针?例如:

enum myEnum { 
     int index; 
     inr count; 
     double value; 
    } myVariable[] { 
      {0,0,0}, 
      {0,0,0}, 
      {0,0,0}, 
      {0,0,0}, 
      {?,?,?} 
     }; 

谢谢。

回答

1

问题是,通过将最后一条记录设置为NULL,您可以在遍历数组时重新标识数组的末尾。

在没有指针的情况下,仍然可能认为某个“特殊”值表示结束,也许countindex在应用程序中永远不会为负,因此,如果看到小于0的值,可能的标记,您可以使用它来可靠地找到结尾。终端标记的另一个常见选择可能是~0(即全1)。

另外,你可以通过一个size_t围绕它。

+0

是的,我明白了。 – 2013-02-09 10:16:19

1

您可以创建特殊的枚举值(例如,-1),您可以使用它作为最后一次输入的标记。