int(*)[] 是什么类型?声明这种类型编译器为什么不报错?

无意中写出来的代码,发现能编译,很是不解:

int main()
{
    int (*p)[];

    return 0;
}

如果类似于 int(*)[2] 我还是明白的,但是这种就不太了解了。

这个 int(*)[] 是什么类型,为什么编译器不会报错。
还有,如果能声明这种类型,那么它能被赋予什么值呢?

阅读 4.8k
2 个回答

int[] 是未知长度的数组(array of unkown bound)。这个是一个不完整类型(incomplete type)。

int (*p)[] 是指向未知长度的数组的指针。

还有,如果能声明这种类型,那么它能被赋予什么值呢?

由于 int[] 是一个不完整类型,int(*)[] 不能通过对一个对象取地址(&)得到。实际对象的类型一定是完整的。
void 也是一个不完整类型,void* 也不能通过一个对象取地址得到,而必须通过类型转换得到。

不过,void* 有一些实际的用处,但是,int(*)[] 虽然合法,却想不到有什么实际用处。

新手上路,请多包涵

其实就是双重指针,等价于int **p

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题