作者LPH66 (-858993460)
看板C_and_CPP
标题Re: [问题] 二维阵列的阵列名称
时间Sun Jul 24 18:18:26 2011
※ 引述《Nairoda (new)》之铭言:
: 多谢 L 大的回答,
: 我能了解
: a 它是个"在 0x22cd0c 的 int[2][3]"
: a[0] 它是个"在 0x22cd0c 的 int[3]"
: a[0][0] 它是个"在 0x22cd0c 的 int"
: 而
: : *a 会是一个"在某处的 int[3]" 而 *(a[0]) 会是一个"在某处的 int"
: : 而某处在哪就是你上面提到的"值"了
: 请问上一句的 "在某处" 感觉上是个变数 (因为 L 大下一段回覆 b 中的 "某处" 是变数
: 的意思)。
: 但这里的某处不是个变数对不对 (这是我的问题一) ? 因为在宣告 int a[2][3] 时, a
: 的位置就与 a[0] 的位置是相同了(一种程式设计的定义?)。
是的 这个某处并不是纪录在某个变数里
以我以前回过的一篇文的讲法就是「它是绑在 a 这个符号上」
因此当有和它相关的位移运算时它就会把这个某处给代进去去运算
因此最後编译出来的程式中 这个值将会直接出现在指令上而不是存在某个变数里
: 我想问个观念是:
: a 会等於 *a 这个现象, 我不太可以用指标变数 与 其所载的内容物的观念去理解它是吗
: ? 因为 a 代表着变数 a 的位置, 而 *a 是变数 a[0] 的位址
: 所以才会得到 a 与 *a 是相同的
: 第二个问题 int (*b)[3]
: 让 b = a, 所以 b 的内容物是 0x22cd0c。这里让 b 反参考 *b 也会得到相同的位址。
: 虽然 b 与 b* 的型别不同, 但 b 与 *b 是相同的位址也是一种上面描述的关系吗 ?
你只能说 a 和 *a 所在的位址相同
(我相信你所谓"相同的"应是此意 但单说"相同的"非常容易让人(包括你自己)误解)
之所以你会陷入"看似相同的东西其实不同"的问题是因为你没有真的去看它的型态
来个简单一点的例子好了 我们拿掉一维
int x[2];
int *y;
y = x;
你应该很清楚知道这个例子中 x x[0] *x y *y 的差别
x 是个 int 的阵列 x[0] 是其中的第一个 int *x 也会取得这第一个 int
y = x 之後 y 这个指标指向上面这个阵列的开头 所以 *y 也会取得同样那第一个 int
再回到你的问题
int a[2][3];
int (*b)[3];
b = a;
a 是个 int 的二维阵列 a[0] 是其中的第一列 *a 也会取得这第一列
b = a 之後 b 这个指标指向上面这个阵列的开头 所以 *b 也会取得同样那第一列
或者换个叙述方式
a 是个 int[3] 的阵列 a[0] 是其中的第一个 int[3] *a 也会取得这第一个 int[3]
b = a 之後 b 这个指标指向上面这个阵列的开头
所以 *b 也会取得同样那一个 int[3]
这样对比叙述你就知道你鬼打墙在哪里了
之所以 b 和 *b 会看起来是一样的值的原因只不过是因为 *b 是那第一列
而我们只是用这第一列的开头位址来代表这一列而已
那因为是第一列所以正好这个开头位址和 b 所纪录的位置 (b 这个指标的值) 一样而已
a 和 *a 也一样 和 b 的差别在於 a 和 *a 都是代表某个阵列
那只是正好这两个阵列的代表值 (它的起始处) 相同而已
因此看起来它们也好像是一样的数字 但其实意义是不同的
---
另外其实可以说一下 b = a; (或是我的例子中的 y = x;) 到底是什麽意思
y = x; 左边是个指标 右边是个阵列
这时它的意思是 "我把右边这个阵列的起始位址设给左边这个指标变数"
也就是其实它的意义是 y = &x[0]; 这样
我们将这个由阵列意义转变成指标意义的概念称做 decay
说成 "阵列 decay 成指标"
关於这个概念可参见 C FAQ 6.3
http://c-faq.com/aryptr/aryptrequiv.html
(其实你可以好好把 C FAQ 第 6 章全部看过一遍
http://c-faq.com/aryptr/index.html
看完後再回来看我这两篇文章会对阵列和指标有更清楚的概念)
--
'Oh, Harry, don't you
see?' Hermione breathed. 'If she could have done
one thing to make
absolutely sure that every single person in this school
will read your interview, it was
banning it!'
---'Harry Potter and the order of the phoenix', P513
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
1F:推 deh3215: 07/24 18:52
2F:推 Nairoda:感谢, 非常清楚 07/24 20:34