配列とポインタについて、二点教えて下さい。
#include<stdio.h>
int main (void){
int test[5]={10,20,30,40,50};
printf("test[0]の値は%dです¥n",test[0]);
printf("test[0]のアドレスは%pです¥n",&test[0]);
printf("test[0]のサイズは%dバイトです¥n.(int)sizeof(test[0]));
printf("test[0]の値は%dです¥n",*test);
printf("test[0]のアドレスは%pです¥n",test);
printf("test[0]のサイズは%dバイトです¥n.(int)sizeof(test));
return 0;
}
二つ質問がございます。
①[]をつけない配列名でアドレスを取得すると、配列の最初の要素のアドレスと同じアドレスが得られるというのは、
printf("test[0]のアドレスは%pです¥n",test);
の部分で示している事でしょうか?
そうなると、
[]が無いことは分かりますが、
②testの前に&が付いていないのは何故でしょうか?
混乱してきました。教えて頂きたいです。
No.3ベストアンサー
- 回答日時:
配列とポインタとの関係については, 前身である B の仕様をひきずっているのでややこしいです.
まず, 配列の「名前」は「配列全体」というオブジェクトを表します. 例えば
int test[5]={10,20,30,40,50};
の場合「test」は「10, 20, 30, 40, 50 という 5個の int型の要素からなる配列全体」を表します.
そして, この「『配列全体』というオブジェクト」は
・sizeof のオペランド
・アドレスを求める単項演算子 & のオペランド
のどちらでもない場合「その配列の先頭要素のアドレス」に変換されます (ほかにも除外されるケースが存在するがこの 2つを押さえておけば十分).
これを前提として
①
printf("test[0]のアドレスは%pです¥n",&test[0]);
と
printf("test[0]のアドレスは%pです¥n",test);
の結果を比較することで「配列の最初の要素のアドレスと同じアドレスが得られる」ことがわかります... 「同じアドレスだからどうした」といわれると (その結果だけでは) なんとも言えませんが.
②上で除外された 2つの場合については「配列全体」がそのままオペランドとして使われます. つまり
・sizeof のオペランドの場合には「配列全体」の大きさが求まる (これはプログラムを動かすとわかるはず)
・単項 & のオペランドの場合には「配列全体」のアドレスが求まる
というふるまいをします. 複数バイトからなるオブジェクトでは「その先頭バイトのアドレスがオブジェクト全体のアドレスとなる」という言語仕様上, アドレス値としては (単項 & をつけた) 「配列全体のアドレス」と (単項 & をつけない) 「配列の先頭要素のアドレス」とは同じ値になります. ただし型は異なるので注意が必要です (たいていの場合は単項 & をつけない方が正しい).
配列の要素を求めるために「[]」をつける場合も上の「除外される場合」には当てはまらないため, 厳密には「一度先頭要素のアドレスに変換される」というルールが適用されます. あと現在の C の規格に従った処理系において「test」と「&test[0]」は必ず一致します>#2.
No.2
- 回答日時:
① そうです。
② 言語仕様です。分かりにくいですが慣れるしかありません。
> []をつけない配列名でアドレスを取得すると、配列の最初の要素のアドレスと同じアドレスが得られる
[]をつけない配列名(test)で得られるのは、配列全体のアドレスです。
配列の最初の要素のアドレスは、&test[0]です。
配列の要素がゼロから順にならんでいるので、結局両者は同じアドレスを示していますが。
もし、配列要素の大きい方から順にデータが並ぶようなシステムがあれば、testと&test[0]は異なるアドレスを示すのかもしれません。
No.1
- 回答日時:
正確な説明ではないかも知れませんが、配列名は「配列の先頭要素を指すポインタ」です。
&test[0] と test+0 は同じ意味です。「+0」は省略できるので、
&test[0] と test は同じ意味です。
書き換えると、
printf("test[0]の値は%dです¥n",test[0]);
printf("test[0]のアドレスは%pです¥n",&test[0]);
printf("test[0]の値は%dです¥n",*(test+0));
printf("test[0]のアドレスは%pです¥n",test+0);
test[1]の方がイメージしやすいかもしれません。
printf("test[1]の値は%dです¥n",test[1]);
printf("test[1]のアドレスは%pです¥n",&test[1]);
printf("test[1]の値は%dです¥n",*(test+1));
printf("test[1]のアドレスは%pです¥n",test+1);
何かヒントになりそうでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
配列を使わずに、変数名を動的...
-
unsigned char配列への入力の仕方
-
Excel、VBAのユーザーフォーム...
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
テキストファイルから文字列を...
-
パイソンの
-
C言語で巨大配列を作るにはどう...
-
【速いブラインドタッチ】手を...
-
複数の選択範囲の行番号を個別...
-
C# 配列の変数宣言について。
-
配列の参照渡しで型が一致しま...
-
【VBS】 フォルダ直下のファイ...
-
プログラムが書けません。
-
配列同士の文字列の比較
-
配列を空にすること.
-
C言語でのカンマ区切りについて
-
ポインタの配列のコンマについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報