作者LPH66 (-858993460)
看板C_and_CPP
标题Re: [问题] 二维阵列的阵列名称
时间Sun Jul 24 11:24:14 2011
※ 引述《Nairoda (new)》之铭言:
: 我看书上说
: 如果设 int a[2][3] = {1,2,3,4,5,6}
: 二维阵列名称 a 被定义为此阵列的起始记忆体位址。我的解读是:
: 这二维阵列的数值在记忆体上被一个连续的记忆体区块储存着, 其中第一个位元组的记忆
: 体序号就是 a, 也就是 a = &a[0][0]。
: 书上说, a[0] 也可以被看成 (a[0])[3], 是一个一维的阵列, 而 a[0] 是此一维阵列的
: 阵列名称, 所以 a[0] 被定义是 (a[0])[3] 的第一个记忆体序号, 所以 a = &a[0][0]。
: 同理 a[1] 可以被看成 (a[1])[3], 是一个一维的阵列, 而 a[1] 是此一维阵列的阵列名
: 称, 所以 a[1] 被定义是 (a[1])[3] 的第一个记忆体序号, 所以 a = &a[1][0]。
: 事实上, 程式 run 出的结果也是这样。
: main(){
: int a[2][3] = {1,2,3,4,5,6};
: printf("a = %p\n", a);
: printf("a[0] = %p\n", a[0]);
: printf("a[1] = %p\n", a[1]);
: }
: 输出结果:
: $ ./a.exe
: a = 0x22cd0c
: a[0] = 0x22cd0c
: a[1] = 0x22cd18
: 我的问题是:
: *a 输出的结果是 0x22cd0c
: *(a+1) 输出的结果是 0x22cd18
: (问题一)
: a 反参考後 (也就是 *a) 会得到与 a 相同的值, 这完全是因为被定义的结果吗? 我不可
: 以把 a 视为是阵列 a[2] 的位址对不对 ? 原因是不是 a[0] 与 a[1] 根本不是个变数
: ?
: (问题二)
: 如果我要接收 a 这个值的说, 要找一个相容的变数, 於是我设了一个指向 int [3] 的指
: 标 b:
: int (*b)[3];
: b = a;
: 这样是合法 ok 的
: 但是, b 的反参考是 *b, 也与 b 变数的值相等, 理由是不是来自於 (问题一) 中, 被定
: 义的情况一样?
: 自己念书的怀惑, 请求各位的帮助, 谢谢!
像 a 这个名字除了它的位置(你讲的"值")以外 它的型态也很重要
a 它是个"在 0x22cd0c 的 int[2][3]"
a[0] 它是个"在 0x22cd0c 的 int[3]"
a[0][0] 它是个"在 0x22cd0c 的 int"
这种型态的差别决定了 *a 和 *(a[0]) 的解释结果不同
*a 会是一个"在某处的 int[3]" 而 *(a[0]) 会是一个"在某处的 int"
而某处在哪就是你上面提到的"值"了
也就是
*a 是 "在 0x22cd0c 的 int[3]"
*(a+1) 是 "在 0x22cd18 的 int[3]"
*(a[0]) 是 "在 0x22cd0c 的 int"
这个样子
b 的情况则不一样 它是一个 (位置在别的地方) 的指标 其内容为 0x22cd0c
那麽 *b 就只是单纯对这个指标内容进行提取而已
只是提取的结果是什麽就又要再看 b 的型态了
这里的 b 型态是 int(*)[3] 所以提取之後就是一个"在某处的 int[3]"
这边的某处因为 b 是指标 所以所指的某处就是 b 的值
因此 *b 就是一个 "在 0x22cd0c 的 int[3]"
这样应该可以让你了解为何"看起来"(印出来)一样的东西实际上会有不同解释
--
所以很多地方才会说"阵列不完全等於指标 只是有时你可以互相换着用"就是如此
--
1989/02/22 优希堂悟 1990/02/22 冬川こころ 1993/07/05 小町つぐみ 1994/05/21 高江
ミュウ 1995/04 欢迎来到 星野游々 1997/03/24 守野いづみ 1997/03/24 伊野瀬チサト
1998/06/18 守野くるみ 1999/10/19 打越钢太郎的 楠田ゆに 2000/02/15 樋口遥 2002/
12/17 八神ココ 2011/01/11 HAL18於朱仓岳坠机 2011/04/02 ∞与∫的世界 茜崎空启动
2012/05/21 第貮日蚀计画预定 2017/05/01~07 LeMU崩坏事故 2019/04/01~07 某大学合宿
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
1F:推 ericinttu:还要配着在等号的左边还是右边来使用 (LHS/RHS) 07/24 11:33
2F:→ ericinttu:我只是补充说明噢 (路人经过 07/24 11:39
3F:→ xatier:跟着念一次:"阵列不等於指标" 07/24 13:17