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个字符*
数组的指针。到目前为止,一切顺利。现在,你想给它分配什么?为什么,它是指向10char*
数组的指针。这是指向另一个不兼容类型的指针
在第一种情况下,初始值设定项的类型是指向与指针指向的类型兼容的“不完整类型”的指针。(它是不完整的,因为数组长度未指定;它是兼容的,因为它在所有其他方面都与其他类型匹配。)指向的对象可以是赋值隐式声明的长度的数组,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;