指向c

时间:2018-08-24 14:34:11

标签: c pointers struct initialization

所以我有一个这样声明的数组(这不是我的代码,我不会修改它):

static const struct {
    int gsmesc;
    int latin1;
    int utf8_int;
    char *utf8;
    ...

} gsm_escapes[] = {
    {  10, 12 , 0x0C, "\x0C" },
    {  20, '^', 0x5E, "\x5E" }, 
    ...
};

请注意,该结构本身是未加标签的

我想使用指针(而不是数组下标)来迭代该数组,而我能想到的最好的方法是,它可以在没有任何警告的情况下进行编译:

typeof(*gsm_escapes) *esc;
...

esc = gsm_escapes;
while (esc++->gsmesc != -1) {

    esc = gsm_escapes;
    while (esc->gsmesc != -1) {

因为这种方法在特征上似乎不够优雅,所以是否存在“正确”的方法来声明此指针类型?

这种数据结构甚至叫什么?我已经搜索了好一阵子了,还没有想出覆盖它的任何入门书。

1 个答案:

答案 0 :(得分:2)

使用typeof是执行此操作的唯一直接方法,因为该结构没有标签。它也是非标准的,因此并非所有编译器都支持。

您的选择是:

  • 保留原样
  • 使用数组符号代替指针符号:

    int i=0;
    while (gsm_escapes[i++]->gsmesc != -1) {
    
        i=0;
        while (gsm_escapes[i]->gsmesc != -1) {
    
  • 使用typedef为结构创建一个typeof。这样,typeof表达式只出现一次:

    typedef typeof(*gsm_escapes) struct_gsm_escapes;
    ...
    struct_gsm_escapes *esc;