&と配列とアドレスの関係性についての質問です。
以下のような処理を書くと、「a」「&a」「&a[0]」は全て同じ
値をさしてしまいます。
「a」と「&a[0]」が同じなのはわかりますが、「&a」も
同じというのは、なぜでしょうか。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
int main(void)
{
int a[1];
printf("%d\n",a);
printf("%d\n",&a);
printf("%d\n",&a[0]);
return 0;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
No.1
- 回答日時:
aと&aはデータ型が違いますが先頭アドレスは同じなので同じ値になります
それとポインタの表示には%dではなく%pを使います
aはint*型
&aはint(*)[1]型
インクリメントすると違いがわかります
#include <stdio.h>
int main(void)
{
int a[2];
int *p = a;
int (*q)[2] = &a;
printf("%p\n",p);
printf("%p\n",p+1); // 4増える
printf("%p\n",q);
printf("%p\n",q+1); // 4*2増える
return 0;
}
No.2ベストアンサー
- 回答日時:
a と &a はデータ型が違う――というのは
既に回答があるとおりでです。
さて、もともと、この場合の、a は、配列名
です。
ですから、&a は、「配列のアドレス」です。
逆に、「式中に現われる型「Tの配列」とい
う左辺値は(3つの例外を除いて)、配列の
最初の要素を指すポインターに意味が格下げ
になる。結果としてできるポインター の型
は「Tへのポインター」となる」
( http://www.kouno.jp/home/c_faq/c6.html#0 )
という決まりがあるので、「配列の名前が書
かれていると、大抵の場合、配列の先頭要素
を指すポインタとして扱われるわけです。
むしろ、a とだけ書いたときに、アドレスが
得られるほうが、「ちょっと変な仕様」であ
るわけです。
ちなみに、上の「3つの例外」のひとつは、
「& の引数になるとき」で、&a の a は、
配列そのものを意味します。
No.3
- 回答日時:
>「a」と「&a[0]」が同じなのはわかりますが、「&a」も
>同じというのは、なぜでしょうか。
「a」が「オブジェクトの先頭アドレス」を意味するからです。
「a」について、コンパイラがどういう解釈をしようが「先頭アドレスは1つ」です。
書き方によって「先頭アドレスがコロコロ変わってしまう」としたら、アドレスが信用できません(笑)
以下のように、要素数を「2以上」にしておいてから「+1」してみると、結果が変わってきます。
int main(void)
{
int a[10];
printf("%p\n",a); //先頭要素へのポインタに格下げ
printf("%p\n",&a); //配列そのもののポインタ
printf("%p\n",&a[0]); //先頭要素へのポインタ
printf("%p\n",a+1); //先頭要素の次、つまりa[1]のポインタ
printf("%p\n",(&a)+1); //配列そのものの次、つまり配列の最後の要素の次のポインタ
printf("%p\n",(&a[0])+1); //先頭要素の次、つまりa[1]のポインタ
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列を使わずに、変数名を動的...
-
2次元配列を戻り値とする関数?
-
先頭アドレスとは何ですか?
-
C言語 配列の長さの上限
-
ExcelVBAで質問です。離れた二...
-
C# 配列の変数宣言について。
-
C# Listを使わずに2次元配列の...
-
unsigned char配列への入力の仕方
-
配列で格納したものをmsgboxで...
-
構造体配列を引数とするDLL作成...
-
Excel、VBAのユーザーフォーム...
-
Redimした動的配列はEraseする...
-
C言語初心者 ポインタについて...
-
VBで構造体の配列を関数に渡す...
-
テキストファイルから文字列を...
-
C言語 配列の再初期化
-
C言語でcharの足し算
-
配列の参照渡しで型が一致しま...
-
なぜ配列は0から始まるのです...
-
VB.NET 構造体の配列の検索機能...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
VBで構造体の配列を関数に渡す...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
先頭アドレスとは何ですか?
-
【速いブラインドタッチ】手を...
-
C# 配列の変数宣言について。
-
C言語初心者 ポインタについて...
-
unsigned char配列への入力の仕方
-
テキストファイルから文字列を...
-
ExcelVBAで質問です。離れた二...
-
Redimした動的配列はEraseする...
-
C言語で特定列だけを抽出して配...
-
擬似コード 長さがmの配列でな...
-
メモリの初期値
-
C言語初心者 構造体 課題について
おすすめ情報