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

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

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

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

但是答案告诉我是数组,所以迷惑不解,希望 V 友们可以给一个答案,谢谢啦~
5181 次点击
所在节点    C
68 条回复
n2l
2017-11-09 08:48:17 +08:00
指向字符串的指针数组竟然错误?这网站准不准啊?
https://i.loli.net/2017/11/09/5a03a585b80d3.png
n2l
2017-11-09 08:51:28 +08:00
指向字符串的指针数组正确显示了,重新输入一遍就好了。
limhiaoing
2017-11-09 09:01:46 +08:00
要看上下文的
变量声明的时候是数组
作为函数参数的时候是指针
smol
2017-11-09 09:34:13 +08:00
是数组,数值的元素是 int**。int* a[4]是指针数组,int (*p)[4]才是指向数组的指针 ;类推过来,int** a[4]也是数组。

不过十分讨厌这样的用法,问这个的题就像孔乙己问茴字的四种写法一样。除非有意炫耀,实际代码中正常人不会这么用的,真的需要多重指针(大多是仅用 C 的场合),也会借用 typedef 进行明确声明。

C/C++这样晦涩的语法太多,标准委员会的一帮古董也是脑回路有问题,还在不断添加新的语法特性,也是够了。
congeec
2017-11-09 09:46:12 +08:00
@q397064399 想想一个函数要修改指针本身的值,怎么修改?

#include <stdio.h>
#include <assert.h>

void fun(int **p) {
....*p = (int *)0x01;
}

int main() {
....int *p = NULL;
....fun(&p);
....assert((unsigned long)p == 0x01);
....return 0;
}
congeec
2017-11-09 09:48:48 +08:00
@smol
委员会:我可以添加,你可以不用
程序员面试的时候:MMP
picone
2017-11-09 09:51:29 +08:00
数组就是指针
你可以理解成[]只是一个操作符,本质上还是指针
FrankHB
2017-11-09 11:44:07 +08:00
@smol 不要瞎扔锅,这就是 DMR 那阵子搞出来的古董,哪来的委员会。

当然 BS 想甩掉而引入 trailing-return-type 又不敢扔掉 C 兼容搞得整体更复杂是另一回事——但是好歹比 Java 从来就没正经打算兼容还瞎倒腾高尚那么点。

@picone 立刻停止你平成的扯蛋行为。
lianz
2017-11-09 11:59:04 +08:00
@LeonLi && @XiaoxiaoPu

1 数组名是不允许重复赋值的,指针可以
=> 你可以把数组看成 const 指针


2 sizeof 问题:
=> sizeof 才是真正的语法糖,编译器根据类型信息帮你计算出大小而已。
enenaaa
2017-11-09 11:59:13 +08:00
因为[]优先级比*高, 所以是数组。
picone
2017-11-09 12:03:26 +08:00
@FrankHB 只是理解问题而已, 用起来不一样
语言本身能实现功能就可以
tabris17
2017-11-09 12:10:34 +08:00
数组不就是指针么,滑稽
Icarooooos
2017-11-09 12:11:18 +08:00
是数组,推荐看《 C 专家编程》,里面讲的很详细。
RLib
2017-11-09 12:15:46 +08:00
只能说数组能隐式弱化成指针, 相反指针转数组只能显式转换
XiaoxiaoPu
2017-11-09 12:32:59 +08:00
看到大神解释的很清楚了之后,还有人一本正经的说数组就是指针,真是尴尬癌都犯了。
dangyuluo
2017-11-09 12:37:36 +08:00
@tabris17 数组怎么能是指针。
FrankHB
2017-11-09 13:06:08 +08:00
@lianz 又是个不知道基础知识点到连左值概念都没还强答的。老实重修。
[]可是直接在 spec 用语义规则钦定等价性了的,sizeof 还能强行语法糖……不用糖的替代语法呢?

@picone 你能确保什么叫理解问题?在哪里理解?确定要理解的问题是什么了?
问题明白挂着“ C/C++/Obj-C ”,足以判断你的回答的主要成分显然就是胡扯。
排除这些内容,“用起来不一样”……不是我要找你茬,且不说哪里不一样,你可曾提到“用”?
picone
2017-11-09 13:26:46 +08:00
@FrankHB 申请数组的时候返回的不就是指针咯
只是为了方便楼主理解.

指针是内存地址, 数组也是内存地址, 只是操作不同, 最终还是能定位到指定的内存地址
jiang1234321
2017-11-09 14:01:30 +08:00
@congeec #3 什么时候需要从左往右读,什么时候从右往左读呢?
msg7086
2017-11-09 14:40:12 +08:00
@picone 数组不是内存地址吧。只是数组的变量名指向了数组的首地址吧。
申请数组,你说的是 new 么,那个返回的是数组的首地址,数组首地址和数组不是一个概念吧。

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

https://www.v2ex.com/t/404784

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

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

© 2021 V2EX