[解決済み】なぜC言語では配列のアドレスと値が等しくなるのか?
2022-04-08 17:34:48
質問
次のコードでは、ポインタの値とポインタのアドレスは予想通り異なっています。
しかし、配列の値とアドレスはそうではありません。
どうしてそうなるのでしょうか?
出力
my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
#include <stdio.h>
int main()
{
char my_array[100] = "some cool string";
printf("my_array = %p\n", my_array);
printf("&my_array = %p\n", &my_array);
char *pointer_to_array = my_array;
printf("pointer_to_array = %p\n", pointer_to_array);
printf("&pointer_to_array = %p\n", &pointer_to_array);
printf("Press ENTER to continue...\n");
getchar();
return 0;
}
解決方法は?
配列の名前は通常、その配列の最初の要素のアドレスとして評価されます。
array
と
&array
は同じ値を持つ(しかし型は異なるので
array+1
と
&array+1
意志
ない
は、配列の長さが1要素以上である場合に等しくなります)。
例外は2つあり、配列名が
sizeof
または単項
&
(Address-of)の場合、名前は配列オブジェクト自身を指します。 したがって
sizeof array
は、ポインタのサイズではなく、配列全体のサイズをバイト数で表します。
として定義された配列の場合
T array[size]
という型になります。
T *
. これをインクリメントすると、配列の次の要素に到達します。
&array
は同じアドレスに評価されますが、同じ定義が与えられると、このポインタは
T(*)[size]
-- つまり、1つの要素ではなく、配列へのポインタです。このポインタをインクリメントすると、1つの要素のサイズではなく、配列全体のサイズが追加されます。たとえば、次のようなコードである。
char array[16];
printf("%p\t%p", (void*)&array, (void*)(&array+1));
2番目のポインタは1番目のポインタより16大きいことが予想されます(16個のcharの配列だからです)。pは通常16進数でポインタを変換するので、次のようになります。
0x12341000 0x12341010
関連
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] 多次元配列の値によるソート方法
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] Javascriptの配列に、指定された値に等しい属性を持つオブジェクトが含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] JavaScriptで配列の長さを初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】.axfファイルとは何ですか?