gpt4 book ai didi

c - 指向整个数组的指针

转载 作者:太空狗 更新时间:2023-10-29 16:11:08 24 4
gpt4 key购买 nike

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 的类型进行强制转换或更改,以使其接受初始化。

关于c - 指向整个数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34276013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com