代码之家  ›  专栏  ›  技术社区  ›  Ree

初始化指向指针的指针数组

  •  4
  • Ree  · 技术社区  · 16 年前

    这个例子很好用:

    static char *daytab[] = {
        "hello",
        "world"
    };
    

    这不是:

    static char *daytab[] = {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    

    我看到的第一个示例创建了一个数组,其中填充了指向两个字符串文本(它们本身就是数组)的指针。第二个例子IMO应该是相同的——创建一个数组并用指向两个char数组的指针填充它。

    有人能给我解释一下为什么第二个例子是错误的吗?

    另外,你可以这样写(还没有测试过):

    static char a[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static char b[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static char *daytab[] = {
        a,
        b
    };
    

    但这看起来工作太多了:)。

    6 回复  |  直到 12 年前
        1
  •  3
  •   Greg Rogers    16 年前

    这是:

    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    

    只是数组初始值设定项。它本身并不创建数组。第一个例子是,当您为指针分配一个字符串文字时,确实在静态存储中创建了这些字符串(对您来说是隐藏的),然后将指针分配给它们。

    所以基本上,没有办法用数组初始值设定项初始化char*。您需要创建一个实际数组,并将这些数字分配给它。你必须做如下的事情:

    char a[][] = { {32, 30, 0}, {34, 32, 33, 0} }; // illegal
    

    但这是违法的。

    您需要单独构建数组,并像上一个示例一样将它们分配到数组中。

        2
  •  3
  •   Paul Beckingham    16 年前

    尝试:

    static char daytab[][13] = {
        {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    };
    

    这些不是char*的,也不是char*的。你可能想要:

    static int daytab[][13] ...
    
        3
  •  3
  •   André Bergner    12 年前

    好吧,这个线程已经有点旧了,但是我正在处理相同的问题,并找到了一种初始化指向数组的指针数组的方法,如下所示:

    #include <iostream>
    using namespace std;
    
    int *a[] = {
      (int[]) { 0 } ,
      (int[]) { 1 , 2 } ,
      (int[]) { 3 , 4 , 5 } ,
      (int[]) { 6 , 7 , 8 , 9 }
    };
    
    main()
    {
      cout
      << a[0][0] << endl
      << a[1][0] << " " << a[1][1] << endl
      << a[2][0] << " " << a[2][1] << " " << a[2][2] << endl
      << a[3][0] << " " << a[3][1] << " " << a[3][2] << " " << a[3][3] << endl;
    }
    

    我得到输出,用gnu g编译++

    0
    1 2
    3 4 5
    6 7 8 9
    

    并使用Intel ICPC进行编译

    0
    1 1
    40896 32767 -961756724
    0 32767 4198878 0
    

    因此,语法在原则上似乎是正确的,只是英特尔编译器不支持它,可能是因为缺乏这种风格的常见用法。


    ---编辑---

    这里还有一个C版本(根据需要):

    #include <stdio.h>
    
    int *a[] = { 
      (int[]) { 0 } , 
      (int[]) { 1 , 2 } , 
      (int[]) { 3 , 4 , 5 } , 
      (int[]) { 6 , 7 , 8 , 9 } 
    };
    
    int main()
    {
      printf( "%d\n" , a[0][0] );
      printf( "%d %d\n" , a[1][0] , a[1][1] );
      printf( "%d %d %d\n" , a[2][0] , a[2][1] , a[2][2] );
      printf( "%d %d %d %d\n" , a[3][0] , a[3][1] , a[3][2] , a[3][3] );
    }
    

    我用gcc和clang测试了它,它打印了正确的结果。 顺便说一句,英特尔编译器的错误输出是一个编译器错误。

        4
  •  1
  •   Ramy Al Zuhouri    13 年前
    static char **daytab;
    daytab=(char**)malloc(2*sizeof(char*));
    daytab[0]=(char*)(char[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    daytab[1]=(char*)(char[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
        5
  •  0
  •   Pete Kirkham    16 年前

    第二个示例的语法是多维数组文字的语法。

    多维数组不是指向数组的指针数组。

    如果一个事物的语法也是另一个事物的语法,这将是令人惊讶的,这取决于它被声明为的类型。

    在第一个示例中,由于字符串文字的计算结果是指针而不是数组值,因此该值的计算结果是指针数组。因为数组文字是作为数组值而不是指针来计算的,所以第二个例子是多维数组——元素是数组值的数组,而不是元素是指向数组值的数组。

    下面的代码演示多维数组、指向数组的指针、指针数组和指向指针的指针的组合。在这三个数组中,只有指针数组和指向指针的指针数组彼此兼容:

    void multi_array (int x[][4], size_t len) // multidimensional array
    {
        for (size_t i = 0; i < len; ++i)
            for (size_t j = 0; j < 4; ++j)
                putchar( 'a' + x[i][j] );
        putchar('\n');
    }
    
    void ptr_array (int (*x)[4], size_t len) // pointer to an array
    { ... as multi_array  }
    
    void array_ptr (int *x[], size_t len) // array of pointers
    { ... as multi_array  }
    
    void ptr_ptr (int **x, size_t len) // pointer to pointer
    { ... as multi_array  }
    
    int main() {
        int a[][4] = { { 1,2,3,4 } };
        int b[] = { 1,2,3,4 };
        int* c[] = { b };
    
        multi_array( a, 1 );
        multi_array( (int[][4]) { { 1,2,3,4} }, 1 ); // literal syntax as value
        ptr_array( &b, 1 );
        array_ptr( c, 1 );
        ptr_ptr( c, 1 ); // only last two are the same
    
        return 0;
    }
    
        6
  •  0
  •   aib    16 年前

    请注意,您的第一个示例也不起作用。它需要:

    static const char *daytab[] = {
        "hello",
        "world"
    };
    

    注意 康斯特 .

    编辑:我所说的“不起作用”,是指不好的实践和容易出错,这是可以说更糟的。