
Cの勉強をするため、Cの勉強用のホームページを読んでいたのですが
その中に
「“int a[10];”というふうに配列を宣言した場合、配列名“a”はその配列の先頭アドレスになります」
という一文がありました。これが理解できません。
「アドレス」はメモリ内の、変数が記憶されている場所のことですよね。
先頭アドレスの「先頭」とは一体何に対して「先頭」なのでしょうか。
「一番前」という意味でしょうか。なら何の中で一番前なのでしょう?
さらにそのホームページでは
「配列名“a”を式の中に書くと、普通は配列の先頭要素を指すポインタになります」
と言いなおしていましたが、これもよくわかりません。
「先頭要素」とは?
一体何に対する先頭なのでしょう?要素の先頭とは何を指すのかがいまいちピンときません。
初心者にありがちなお恥ずかしい質問ではありますが、ご教授いただければ幸いです。
No.3ベストアンサー
- 回答日時:
例えば、int型が4バイトの場合...
int a[10];
のように配列を宣言すると、
+0+1+2+3
a[0]: □□□□
a[1]: □□□□
a[2]: □□□□
a[3]: □□□□
a[4]: □□□□
a[5]: □□□□
a[6]: □□□□
a[7]: □□□□
a[8]: □□□□
a[9]: □□□□
(□1つが1バイトを表しています)
のようにメモリ上には配置されます。
ここで、「先頭要素」というのは、配列aの最初の要素のことですからa[0]のことです。先頭アドレスというのは、先頭要素a[0]の最初のアドレス(上の表では+0のところのアドレス)になります。
各要素(a[0]とかa[1]とか)は、それぞれint型ですから4バイトで構成されます。この4つのバイトには、それぞれアドレスがふられているわけですが、具体的に整数値のどの部分がどのアドレスに相当するかは処理系(多くの場合はプロセッサ)に依存します。
例えば、馴染みの深いIntelのプロセッサの場合、通常、次のようになります。
a[0]が0x12345678という値だった場合、
+0: 0x78
+1: 0x56
+2: 0x34
+3: 0x12
のように格納されます。
なお、
> 「配列名“a”を式の中に書くと、普通は配列の先頭要素を指すポインタになります」
の意味するところは、配列型は多くの場合、暗黙的にポインタ型に型変換されます。ポインタ型に型変換された場合、元の配列の先頭要素を指すポインタの値になります。「普通は」とあるのは、そうならない場合もあるということです。具体的には、sizeof演算子や&演算子のオペランド(演算対象)になった場合です。
わかりやすい図での解説、ありがとうございます。
今までメモリ領域のことを棒グラフのように直線状だと思い込んでいましたが、
バイトの存在をすっかり忘れておりました。
ここで気づくことができてよかったです。
>a[0]が0x12345678という値だった場合
お礼欄に質問を書くのもどうかと思うのですが、
0xと12345678の関係がよくわかりません。(無知ですみません・・・)
今までは1001とか、1002などの単純な数字のアドレスしか見たことがなかったもので・・・
簡単でいいので、ご説明願えませんでしょうか。
>「普通は」とあるのは、そうならない場合もあるということです。
>具体的には、sizeof演算子や&演算子のオペランド(演算対象)になった場合です。
sizeof演算子や&演算子のオペランド(演算対象)はまだ習っていないのでよくわかっていないのですが、
必ずしも先頭要素=先頭アドレスではないということはわかりました。
今後sizeof演算子等を勉強する際の参考にさせていただきます。
このたびはどうもありがとうございました。
No.6
- 回答日時:
★0x と 12345678 の関係
・int 型が 4 バイトのとき、a という配列1つに 0x12345678 という値(データ)を代入したとします。
するとメモリ上では下のようにセットされます。
a[ 0 ] = 0x12345678;
1バイト目が 0x78 の1バイトデータ
2バイト目が 0x56 の1バイトデータ
3バイト目が 0x34 の1バイトデータ
4バイト目が 0x12 の1バイトデータ
となります。
・なお、上記のメモリ・イメージは Intel 系のプロセッサ(CPU)の場合です。
もしも、Motorola 系のプロセッサ(CPU)の場合は
1バイト目が 0x12 の1バイトデータ
2バイト目が 0x34 の1バイトデータ
3バイト目が 0x56 の1バイトデータ
4バイト目が 0x78 の1バイトデータ
となります。
・通常のプログラミングでは、あまり意識しなくても良いですが、メモリ・イメージをファイルに
保存したり読み出したりするときは、プロセッサ(CPU)の違いにより上記のような2タイプがあるのです。
Intel 系のプロセッサ(CPU)のような格納方法を『リトルエンディアン』と呼び、
Motorola 系のプロセッサ(CPU)のような格納方法を『ビッグエンディアン』と呼びます。
また、格納方法のことを『バイトオーダー』とか、単に『エンディアン』などと呼びます。
・『今までは 1001 とか、1002 などの単純な数字のアドレス…。』となっていますが、0x12345678 は
アドレスの数値ではありません。データの内容(値)のことです。
jacta さんの回答にあった int 型(4バイト)に 0x12345678 の値を代入したときのメモリ・イメージが
+0: 0x78
+1: 0x56
+2: 0x34
+3: 0x12
と格納されますよ。って事です。
1バイトずつ 0x78、0x56、0x34、0x12 と順番に格納されるのが『リトルエンディアン』方式で CPU は
Intel のプロセッサとなります。→私の使っているパソコンは Intel 系ですので『リトルエンディアン』
方式でメモリにはデータが格納されているようです。68000系(Motorola) のパソコンならばバイト列が
逆転して格納され、この方法が『ビッグエンディアン』なのです。
・以上。分かりましたか。
参考文献:
・http://www.atmarkit.co.jp/icd/root/70/5784470.html→『バイトオーダー』
・http://cai.int-univ.com/sugsi/Lecture/NetProg/ch …→『バイトオーダについて』
参考URL:http://e-words.jp/w/E38390E382A4E38388E382AAE383 …
穴だらけの理解で申し訳ありません。
しかし、こうしてご指導いただき、とても勉強になります。
ありがとうございます。
0x と 12345678 の関係につきましては、最初Motorola 系のプロセッサの考え方が先にきてしまい、
なぜ一バイト目に大きい方から埋めていくのかなあ・・・と考えておりました。
PCの環境もプログラミングに大きく影響するのですね・・・
一応知識としては知っていたつもりでしたが、ここでもこんな違いが生まれるとは知りませんでした。
このたびはどうもありがとうございました。
No.5
- 回答日時:
> 必ずしも先頭要素=先頭アドレスではないということはわかりました。
そうではなく、必ずしも配列名=先頭アドレスではないということです。
確かに、必ずしも先頭要素=先頭アドレスではないのですが、それはまた別の話です。
この回答への補足
基本的なところを間違えていましたね…お恥ずかしいです。
間違えたまま覚えるところでした。
ご指摘、どうもありがとうございました。
No.4
- 回答日時:
> 0xと12345678の関係
0xは、16進数のことです。0~9, a~f(大文字も可)の16種類の文字を
使って数値を表現します。
0x12345678と書くと、「千二百三十四万五千六百七十八」ではなく、
1*(16の7乗)+2*(16の6乗)+3*(16の5乗)+...+7*(16の1乗)+8
を表わします。
No.2
- 回答日時:
int a[10]; と配列を定義すると、メモリ中のどこかのアドレスに
a[0]~a[9]の10個の要素を連続して配置します。
このとき、配列名aは、配列の先頭要素であるa[0]を
格納しているアドレスと同義です。
回答ありがとうございます。
物に例えるなら、
部屋の中に番号の書いたダンボール箱を0~9番の順に置いて、
番号の若い順から前→後ろと定義していく感じでしょうか。
0番の置いてある場所が畳の一枚目であれば、
一番目の畳が先頭アドレス(0~9番のダンボールの代表住所)
になる・・・みたいな感じで頭に置き換えて考えています。
一応自分でも調べてみたのですが、「先頭アドレス」ではIT単語集にひっかからず困っておりました。
解説していただけてとても助かっています。

No.1
- 回答日時:
>先頭アドレスの「先頭」とは一体何に対して「先頭」なのでしょうか。
a[10]としてメモリ上に取られる領域の「先頭」になります。
>「先頭要素」とは?
この場合だとa[0]になります。配列の「先頭」です。構造体なども同じように表せるので「先頭要素」という言い方になります。
回答ありがとうございます。
←使用 メモリ領域→
0 1 2 3 4 5 6 7 8 9
前 ■■■■■■■■■■ 後ろ
↑ ↑
ここ a=10
こういう感じでよろしいのでしょうか?
何をもってして前とするのか後ろとするのかはよくわかっていないのですが・・・
添え字の順番で一番小さいのが先頭・・・だと思います。
>構造体なども同じように表せるので「先頭要素」という言い方になります。
なるほど!
先頭アドレスと先頭要素の二種類の呼び方があるのはそういうことだったのですね。
このたびはどうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- その他(メンタルヘルス) 株の学校 勉強の成果を銘柄選択できない。 4 2022/06/21 13:42
- Excel(エクセル) Excelについて質問です(ver2019) 1 2023/06/30 21:20
- 電車・路線・地下鉄 列車の号車番号について 4 2023/05/19 08:43
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
可動コイル形電流計に交流電流を加えたら
物理学
-
CMOSゲートはなぜ負論理(NAND、NOR)?
その他(自然科学)
-
-
4
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
5
誘電体のある同心円筒導体について
物理学
-
6
エミッタ接地回路のバイパスコンデンサについて
物理学
-
7
ポインタのキャスト
C言語・C++・C#
-
8
バッファとは何ですか
C言語・C++・C#
-
9
c言語です コンパイルした時に出るNOTEとはなんですか??
C言語・C++・C#
-
10
以下の実測データ(ダイオードのIV特性)からn値を求める方法なのですが,どのように求めればいいのです
工学
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
C言語Char型配列に小数値を入れ...
-
テキストファイルから文字列を...
-
2次元配列でエラーがでます。
-
C++を本で独学してますが、配列...
-
Redimした動的配列はEraseする...
-
アクセスランキングを作成する方法
-
配列とポインタ
-
GPUで配列演算
-
銀行ATMの数字キーの配列
-
ゼロサプレスって?
-
配列をEraseしてもメモリが開放...
-
複数のボタンを配列で扱う方法...
-
unsigned char配列への入力の仕方
-
プログラムの作り方
-
C言語で、他の関数で配列を書...
-
【VBS】 フォルダ直下のファイ...
-
VBで構造体の配列を関数に渡す...
-
【速いブラインドタッチ】手を...
-
構造体から平均点を求める方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
C# Listを使わずに2次元配列の...
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
【速いブラインドタッチ】手を...
-
配列をEraseしてもメモリが開放...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C# 配列の変数宣言について。
-
複数の選択範囲の行番号を個別...
-
VBで構造体の配列を関数に渡す...
-
先頭アドレスとは何ですか?
-
配列の参照渡しで型が一致しま...
-
銀行ATMの数字キーの配列
-
配列を含む構造体の初期値について
-
C言語で特定列だけを抽出して配...
-
unsigned char配列への入力の仕方
-
VB.NET 構造体の配列の検索機能...
-
C++ vectorに配列をプッシュしたい
-
C言語初心者 構造体 課題について
おすすめ情報