Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向整个数组的指针_C_Arrays - Fatal编程技术网

C 指向整个数组的指针

C 指向整个数组的指针,c,arrays,C,Arrays,我的教授教我们如何分配一个灵活的数组,然后分配一个指向整个指针数组的指针 void*(*单元格)[10]=&g->cells&array是包含10个指向char的指针的数组的地址 指针是指向数组的指针,该数组包含两个指向字符的指针 2!=10 , 因此发出警告 有一个方便的方法可以帮助您理解困难的c减速。让我们先看看您的正确声明: 要理解这一点,首先要认识到单元格是要声明的标识符,并遵循优先级规则: (*cells)表示cells是一个指针,声明的其余部分描述了指向的对象。括号只是为了强制执行优

我的教授教我们如何分配一个灵活的数组,然后分配一个指向整个指针数组的指针


void*(*单元格)[10]=&g->cells
&array
是包含10个指向char的指针的数组的地址

指针
是指向数组的指针,该数组包含两个指向字符的指针

2!=10
, 因此发出警告


有一个方便的方法可以帮助您理解困难的c减速。

让我们先看看您的正确声明:

要理解这一点,首先要认识到
单元格
是要声明的标识符,并遵循优先级规则:

  • (*cells)
    表示
    cells
    是一个指针,声明的其余部分描述了指向的对象。括号只是为了强制执行优先级,就像在算术表达式中一样
  • 接下来应用
    [10]
    ,因为括号比一元
    *
    具有更高的优先级。这表示,
    (*单元格)
    是一个包含10个元素的数组
  • 这就留下了前面的
    void*
    ,它给出了每个元素的类型
  • 如果我们看一下
    &g->cells
    ,它是一个指向一个数组的指针,数组中包含未指定数量的
    void*

    现在考虑你的代码:

    按照类似的过程,我们得到
    指针
    被声明为指向2个
    字符*
    数组的指针。到目前为止,一切顺利。现在,你想给它分配什么?为什么,它是指向10
    char*
    数组的指针。这是指向另一个不兼容类型的指针

    在第一种情况下,初始值设定项的类型是指向与指针指向的类型兼容的“不完整类型”的指针。(它是不完整的,因为数组长度未指定;它是兼容的,因为它在所有其他方面都与其他类型匹配。)指向的对象可以是赋值隐式声明的长度的数组,C将视指针为


    在第二种情况下,C可以看到这两个指针肯定指向大小不同的对象,因此赋值肯定是不正确的。您需要对
    指针的类型进行强制转换或更改以使其接受初始化。

    当您在问题中说“给了我一个编译器错误”时,您应该始终包含错误。@Adam感谢您提醒数组长度是该类型的一部分
    char*(*指针)[2]
    是指向
    char*
    的2元素数组的指针。也许
    char*(*指针[2])[10]
    可以得到指向
    char*
    的10个元素数组的指针的2个元素数组?如果你的教授这么说,他错了。他可以将
    单元格
    字段声明为
    字符单元格[0],而不是不完整的类型定义,这可能是编译器抱怨的原因,因为编译器无法知道结构网格的大小,因为其中定义了不完整的类型。
    
    struct grid {
        int width, height;
        void *cells[];
    };
    typedef struct grid grid;
    
    int main(){
        enum { width = 2, height = 10 };
        grid *g = malloc(sizeof(grid) + width * height * sizeof(void *));
        void *(*cells)[10] = &g->cells;
    }
    
     char *array[10];
     char *(*pointer)[2] = &array;
    
    warning: incompatible pointer types initializing
          'char *(*)[2]' with an expression of type 'char *(*)[10]'
           [-Wincompatible-pointer-types]
           char *(*pointer)[2] = &array;
    
    void *(*cells)[10] = &g->cells;
    
    char *array[10];
    char *(*pointer)[2] = &array;