关于指针的疑惑, int **p[10], p 是数组还是指针?

2017-11-09 00:25:47 +08:00
 Lxxyx
RT.
遇到一个题目,问的是这个。

我这儿的推断是,p 是一个指向指针数组的指针,所以是指针。

因为 int *p[10]是指针数组,而第二个*号指向这个数组,所以是指针。

但是答案告诉我是数组,所以迷惑不解,希望 V 友们可以给一个答案,谢谢啦~
5328 次点击
所在节点    C
68 条回复
afpro
2017-11-10 10:21:13 +08:00
楼上都在扯什么鬼啊 不能正常回答楼主问题咩
这种情况类型判断顺序是 从右到左 从里到外
int *p[10] 就是 [10]确定是数组 *确定数组里是指针 int 确定指针指向 int
如果想反过来声明一个指向数组的指针 就用括号 int (*p)[10]
Mitt
2017-11-10 10:35:44 +08:00
@ryd994 这不是优化 而是可以推导的, 就像上面说的可变数组,也不过是编译器提前算好你可变数组的定义长度 然后再 * 你的数组长度而已 并且他只能分配到栈上而不是堆上, 也就是在编译时就已经确定的东西,sizeof 本身并不是一个函数,而是一种运算符,是属于编译器的 你可以看 sizeof 和 strlen 的区别 而且我们说 sizeof 之前的点是数组是不是指针这一说 而举例出的 sizeof
ryd994
2017-11-10 13:13:58 +08:00
@Mitt 我觉得你根本没懂什么是 vla,vla 的大小是运行时决定的,和你在这里用的定长数组根本不是一回事。楼上说 vla 也不过是为了说明 sizeof 并不总是可推导的。
zhicheng
2017-11-10 14:13:22 +08:00
数组是数组,指针是指针,不要乱讲。数组指的是一段内存空间,指针是一段内存地址。

struct foo1 {
long bar[1];
};

struct foo2 {
long *bar;
};

这两个结构体占的内存一样,可存储的东西很不一样。
wwqgtxx
2017-11-11 16:07:21 +08:00
@zhicheng 你这个代码在不同的平台上不一定内存占用的一样,因为 long*和 long[0]占用的内存并不永远是一样的
zhicheng
2017-11-11 16:10:57 +08:00
@wwqgtxx 我知道,但这不影响我的观点。
wwqgtxx
2017-11-11 16:13:28 +08:00
@ryd994 个人感觉 vla 算是对 sizeof 的一个特例(也是有些编译器死活不愿意支持的原因),在排除 vla 的情况下,sizeof 的结果应该就是一个编译期间可以确定的参数。
这个情况就类似于 c++的虚函数导致了需要编译器必须实现一个虚表来间接获得函数入口地址,而正常情况下函数的入口地址应该在编译或者链接期间是一个确定的值
mn66
2018-03-10 09:48:14 +08:00
这个应该是指向指针(*p [](是指向整形数组的))的指针,书上都有,应该把书好好看一下,在指针那节。所以 p 是指针。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/404784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX