繁体   English   中英

指针指向整个数组

[英]pointer pointing to an entire array

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;
}

我的教授告诉我们这种分配灵活数组的好方法,然后分配指向整个指针数组的指针

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; 

要理解这一点,首先要认识到cells是被声明的标识符,并从那里遵循优先规则:

  1. (*cells)表示cells是一个指针,声明的其余部分描述了指向的东西。 括号只是强制执行优先级,就像在算术表达式中一样。
  2. 接下来[10]适用,因为括号比一元*具有更高的优先级。 这就是说, (*cells)是一个包含10个元素的数组。
  3. 这留下了前面的void * ,它给出了每个元素的类型。

如果我们查看&g->cells ,它是一个指向未指定数量的void *的数组的指针。

现在考虑你的代码:

 char *array[10]; char *(*pointer)[2] = &array; 

按照类似的过程,我们得到pointer被声明为指向2 char *数组的指针。 到现在为止还挺好。 现在,您要分配给它的是什么? 为什么,它是一个指向10个 char *的数组的指针。 这是指向不同的,不兼容的类型的指针。

在第一种情况下,初始化程序的类型是指向“不完整类型”的指针,该指针与指针指向的类型兼容。 (它是不完整的,因为数组长度是未指定的;它是兼容的,因为在所有其他方面它与另一种类型匹配。)指向的东西可以是赋值隐式声明的长度数组,C将处理指针好像是的。

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

&array是包含10个指向char的指针的数组的地址

pointer是一个指向包含2个指向char的指针的数组的指针

2 != 10 ,因此警告。

有一个方便的网站 ,有助于理解困难的c减速。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM