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

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

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

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

但是答案告诉我是数组,所以迷惑不解,希望 V 友们可以给一个答案,谢谢啦~
5328 次点击
所在节点    C
68 条回复
LeonLi
2017-11-09 14:41:08 +08:00
@lianz
我觉得不了解 C 语言就不要硬拗了吧,你说了半天都是你自己所谓的理解,自己去翻一下 C 语言标准看看里面怎么规定的很难么?
fcten
2017-11-09 14:52:41 +08:00
说数组和指针是同一个东西的……是不是觉得手机和手机号也是同一个东西?
picone
2017-11-09 15:14:16 +08:00
@msg7086 额..是的. 数组代表的是它的内存的首地址. 最终数组访问跟直接用指针访问,最后都是同一块的数据, 只是操作的形式不同
crazyneo
2017-11-09 15:43:03 +08:00
@picone 不明白数组和指针区别的,也就基本告别左右值和模板参数类型推演以及之后一连串的特性了,读一读 essential c 也行,不是你理解的那么回事儿。
lany
2017-11-09 16:02:06 +08:00
这让我想起了一个好玩的东西。
char* p1
char** p2
char*** p3
char**** p4
char***** p5
zbcwilliam
2017-11-09 16:10:01 +08:00
数组;数组元素是指向指针的指针
FrankHB
2017-11-09 18:56:56 +08:00
@picone 你就这么急着强行加戏,是嫌 LZ “理解”的还不够多不够混乱?
我有些好奇你是怎么把“指针是内存地址,数组也是内存地址”“数组代表的是它的内存的首地址”这类无中生有的笑话大言不惭拿来帮助别人理解的。
Pyjamas
2017-11-09 19:00:59 +08:00
数组是 decay 到指针的,并不和指针等价

https://stackoverflow.com/questions/1461432/what-is-array-decaying
Pyjamas
2017-11-09 19:06:41 +08:00
> 指针是内存地址, 数组也是内存地址, 只是操作不同, 最终还是能定位到指定的内存地址

@picone 你的说法其实可以套用到,int 也是二进制数据,float 也是二进制数据,只是操作方式(解释方式)不同,有什么区别吗? 传值也是传数据,传引用也是传数据,只是数据的地址不同,有什么区别吗?
Pyjamas
2017-11-09 19:09:40 +08:00
@Pyjamas
> 传值也是传数据,传引用也是传数据,只是数据的地址不同,有什么区别吗?

改一下:传值也是传数据,传引用也是传数据,只是操作的形式不同,最终还是能定位到指定的内存地址,所以传值=传引用
picone
2017-11-09 20:34:27 +08:00
@FrankHB #47 好吧,那你说一下 指针放的不是内存地址是啥, 数组的变量名不是内存首地址又是啥, 或者给个传送门? 直接喷人没意思
picone
2017-11-09 20:36:05 +08:00
@Pyjamas #49 嗯 是的.. 这么说是不同的。谢谢指教。
nullcc
2017-11-09 22:06:13 +08:00
有一种笨办法,一层层拆开来看:

int **p[10],p 是什么?

1. **p[10]是一个 int
2. *p[10]是一个 int 型指针
3. p[10]是一个指向 int 型指针的指针
4. p 是一个指向 int 型指针的指针的数组
lrxiao
2017-11-10 00:38:01 +08:00
这问题居然能引来地球。。
msg7086
2017-11-10 01:16:46 +08:00
@picone
比如说吧。
int a[5];
这里你问 a 是个什么东西 —— a 是个数组。
你问 a 作为常量读出来的值是多少 —— 值是 a 的首地址。

所有的变量到最后都是内存里的一小块数据,你也不能说整数就是浮点数吧。
Mitt
2017-11-10 02:13:19 +08:00
关于 sizeof
源码和结果:
https://imgur.com/Uhjn72f

汇编代码:
https://imgur.com/DAqz7be

另: 上面自以为是的家伙已 Block
Mitt
2017-11-10 02:14:01 +08:00

ryd994
2017-11-10 06:46:57 +08:00
@Mitt 你这个例子不能证明任何问题
他们说的是 VLA 的情况
我也可以说是编译器帮你把常量优化了
你要不要试试 1-100 求和?编译器能给你直接优化成 printf("%d", 5050)
chiu
2017-11-10 07:21:39 +08:00
@lianz 但他们类型不一样
smol
2017-11-10 09:36:12 +08:00
@FrankHB 倒不是甩锅给委员会,这个问题跟他们也没毛关系。只是感叹一下委员会还在不断加新的语法特性,C/C++本身就是一把容易伤手的电锯了,他们还要给这把电锯增加钻头,安装链条。是的,新的电锯可以更省力,更全能,但是也更容易伤着人了。

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

https://yangjunhui.monster/t/404784

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

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

© 2021 V2EX