[英]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
是被声明的标识符,并从那里遵循优先规则:
(*cells)
表示cells
是一个指针,声明的其余部分描述了指向的东西。 括号只是强制执行优先级,就像在算术表达式中一样。 [10]
适用,因为括号比一元*
具有更高的优先级。 这就是说, (*cells)
是一个包含10个元素的数组。 void *
,它给出了每个元素的类型。 如果我们查看&g->cells
,它是一个指向未指定数量的void *
的数组的指针。
现在考虑你的代码:
char *array[10]; char *(*pointer)[2] = &array;
按照类似的过程,我们得到pointer
被声明为指向2 char *
数组的指针。 到现在为止还挺好。 现在,您要分配给它的是什么? 为什么,它是一个指向10个 char *
的数组的指针。 这是指向不同的,不兼容的类型的指针。
在第一种情况下,初始化程序的类型是指向“不完整类型”的指针,该指针与指针指向的类型兼容。 (它是不完整的,因为数组长度是未指定的;它是兼容的,因为在所有其他方面它与另一种类型匹配。)指向的东西可以是赋值隐式声明的长度数组,C将处理指针好像是的。
在第二种情况下,C可以看到两个指针肯定指向不同大小的对象,因此赋值肯定是不正确的。 您需要对pointer
类型进行pointer
转换或更改以使其接受初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.