全然異なるアドレッシング法で同じ結果?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
青青

全然異なるアドレッシング法で同じ結果?

#1

投稿記事 by 青青 » 6年前

コード:

ushort divHists[200][8 * 4] = { { 0 } };

ushort* p1 = (ushort*)divHists;
ushort* p2 = (ushort*)&divHists;
ushort* p3 = (ushort*)&divHists[0];
ushort* p4 = (ushort*)&divHists[0][0];
上記p1,p2,p3,p4 は同じ結果だと確認しましたが、
理解できないのです。
特に、divHists と &divHists が同じ値であるのは不可解です。

解釈できる方お願いします。

かずま

Re: 全然異なるアドレッシング法で同じ結果?

#2

投稿記事 by かずま » 6年前

1. divHists の型は ushort [200][32] ですが、配列型は、
式の中では「先頭要素へのポインタ」へ暗黙の型変換が
行われて、その型は ushort (*)[32] になります。

2. この暗黙の型変換には例外があって、それは、配列型が
sizeof または単項演算子& のオペランドであるときです。
&divHists の型は、「先頭要素へのポインタ」ではなく、
「配列全体へのポインタ」 ushort (*)[200][32] になります。

3. divHists[0] の型は ushort [32] です。単項演算子& の
オペランドにした &divHists[0] の型は ushort (*)[32] です。

4. divHists[0][0] の型は ushort です。単項演算子& の
オペランドにした &divHists[0][0] の型は ushort * です。

1 と 3 は、型も値も同じです。

ushort divHists[200][32]; で ushort が 2バイトだと
配列 divHists は12800バイトのメモリ領域を割り付けられ、
2 は、この領域全体へのポインタ。
1 と 3 はこの領域を 200分割した先頭 64バイトへのポインタ。
4 は、この領域の先頭 2バイトへのポインタ。

型は異なりますが、領域の先頭アドレスであることは同じです。
したがって、明示的な型変換であるキャスト演算子 (ushort*)
を作用させて同じ型にしてもしなくても、値は同じです。

かずま

Re: 全然異なるアドレッシング法で同じ結果?

#3

投稿記事 by かずま » 6年前

言葉で説明するより、図を見れば一目瞭然だと思うんですが、いかがですか?

コード:

int a[3][4]; という宣言があったとすれば、それは、
3行4列の行列です。


&a : 行列全体へのポインタ
     +---------+---------+---------+---------+
     | a[0][0] | a[0][1] | a[0][2] | a[0][3] |
     +---------+---------+---------+---------+
     | a[1][0] | a[1][1] | a[1][2] | a[1][3] |
     +---------+---------+---------+---------+
     | a[2][0] | a[2][1] | a[2][2] | a[2][3] |
     +---------+---------+---------+---------+

&a[0] : 0行目へのポインタ (a は &a[0] と同じ)
     +---------+---------+---------+---------+
     | a[0][0] | a[0][1] | a[0][2] | a[0][3] |
     +---------+---------+---------+---------+

&a[0][0] : 0行0列目へのポインタ
     +---------+
     | a[0][0] |
     +---------+

ポインタの型は異なるが、ポインタの値(アドレス) は同じ。

&a[1] と &a[1][0] も、ポインタの値(アドレス)は同じ。
&a[2] と &a[2][0] も、ポインタの値(アドレス)は同じ。

青青

Re: 全然異なるアドレッシング法で同じ結果?

#4

投稿記事 by 青青 » 6年前

かずま 様
本当に素晴らしい解説ですね!
これ以上ないと思います。
理論も、ご解説のしかたも、最高です。

お陰様で自分が完全に理解できました。

厚くお礼を申し上げます。

返信

“C言語何でも質問掲示板” へ戻る