作者su31o4gj83 (哈哈哈哈哈哈哈哈哈哈哈)
看板C_and_CPP
标题Re: [问题] 怪问题 array's address ?
时间Tue Jul 14 15:11:03 2009
下面这个网页有说明"阵列的名称"并不是一个pointer, 但使用上与const pointer很类似
http://www.daniweb.com/forums/thread171080.html#
网页中提了两个观点说明"阵列名称"并不是一个pointer
第一个就是原po所提到的问题
第二个就是第16544篇提到的问题
了解到"阵列名称"不是pointer後, 应该就很好解释上述两个情况了
#### 分隔线 ####
不过我还有些地方不是很了解,
所谓的array type也算是种资料型态吗?
像是int, double, char等等, "占有记忆体, 并存放一些资料"
根据sizeof的结果, array type的大小就是整个阵列的大小
存放的数值就是第一个元素的位址
但是这样的想法根本就不可能
因为根本不需要整个阵列的记忆体去存一个位址
而且阵列的记忆体有其他资料要存, 哪里还会有位子可以存一个位址
一整个混乱@@
有人可以说明一下array type运作的机制吗 ?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.209.20.225
1F:推 zlw:array就是一块连续的记忆体,需要取值时就用mov指令,指定记忆 07/14 15:21
2F:→ zlw:体位址後放到暂存器。运作机制就是这样。 07/14 15:22
3F:→ zlw:这是指x86指令集,MIPS大概是用LW指令吧 07/14 15:23
4F:推 rebellian:正确的说法(书本的写法)是说array name不是variable 07/14 15:55
5F:推 rebellian:主要的差别是pointer的值可以改变 但array name不行 07/14 16:00
6F:推 zlw:如果 int n; 的 n 是变数,那 int arr[2]; 的 arr 就也是变数 07/14 16:06
7F:→ zlw:只不过是资料型态不同的变数 07/14 16:07
8F:→ softwind:sizeof 是编译期关键字啦 run alloc的 看不出来 07/15 00:55
9F:推 rebellian:说他不是变数的原因是因为你可以 n++ 但不能 arr++ 07/15 04:08
10F:推 Ebergies:C/C++ array 不是变数, JAVA/C# 之类的才是 07/15 09:31
11F:推 zlw:不算吗...大概是我观念有错 07/15 09:40
12F:推 UNARYvvv:那句话在 K&R II 里面 5.3 Pointers and Arrays 07/15 20:20
13F:→ UNARYvvv:".. an array name is not a variable .." 07/15 20:21
14F:推 UNARYvvv:不过也可以看看 2.4 Declarations 07/15 20:34
15F:→ UNARYvvv:"A declaration specifies a type, and contains a list 07/15 20:35
16F:→ UNARYvvv:of one or more variables of that type, .." 之後举的例 07/15 20:36
17F:→ UNARYvvv:子是有 array 的 07/15 20:36
18F:推 zlw:探求本义的话,如果 arr 代表的仅只是所在处记忆体位址的别名 07/15 20:48
19F:→ zlw:那当然不是一个变数。而如果把 arr 跟 n 一样视为某块记忆体 07/15 20:49
20F:→ zlw:可以存取而非唯读的记忆体,那这时候就算变数了吧 07/15 20:50