[解決済み] sizeof()を使用せずに配列のサイズを決定する方法は?
質問
C言語の面接の質問で、「sizeof演算子を使わずにC言語で配列のサイズを求めるにはどうすればいいですか?それは動作しますが、私は理由を理解することができません。
#include <stdio.h>
int main() {
int a[] = {100, 200, 300, 400, 500};
int size = 0;
size = *(&a + 1) - a;
printf("%d\n", size);
return 0;
}
予想通り、5を返します。
edit: 人々が指摘した これ という回答がありましたが、構文が少し違っています。
size = (&arr)[1] - arr;
ということで、どちらの質問も有効で、問題に対するアプローチが少し違うのだと思います。皆さん、絶大な助けと丁寧な説明をありがとうございました!
どのように解決するのですか?
ポインタに1を足すと、その結果は、指された型のオブジェクトのシーケンス(つまり、配列)の次のオブジェクトの位置になります。 もし
p
を指している場合
int
オブジェクトを指定すると
p + 1
は次の
int
を指します。 もし
p
が5要素の配列を指している場合
int
(を指す(この場合,式
&a
という表現)、次に
p + 1
は次の
の5要素配列
int
を配列にしたものです。
2つのポインタ(両方とも同じ配列オブジェクトを指しているか、片方が配列の最後の要素を過ぎている場合)を引くと、その2つのポインタの間のオブジェクト(配列要素)の数が得られます。
式は
&a
のアドレスを返します。
a
のアドレスを生成し、型は
int (*)[5]
(の5要素配列へのポインタ)。
int
). 式
&a + 1
の次の5要素配列のアドレスを返します。
int
に続く
a
であり、また、型
int (*)[5]
. という式は
*(&a + 1)
の結果を参照します。
&a + 1
のアドレスが得られるように、最初の
int
の最後の要素に続く最初の
a
の最後の要素に続くもので、タイプは
int [5]
の式に分解されます。
int *
.
同様に、式
a
は配列の最初の要素へのポインタに分解され、型は
int *
.
画像があると便利です。
int [5] int (*)[5] int int *
+---+ +---+
| | <- &a | | <- a
| - | +---+
| | | | <- a + 1
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
+---+ +---+
| | <- &a + 1 | | <- *(&a + 1)
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
| - | +---+
| | | |
+---+ +---+
これは、同じストレージの2つのビューです。左側では、5要素の配列のシーケンスとして表示し、右側では
int
の 5 要素の配列のシーケンスとして、一方右側では
int
. また、様々な表現とその種類も示している。
注意することは、式
*(&a + 1)
の結果は
未定義の動作
:
...
結果が配列オブジェクトの最後の要素の1つ前を指している場合,その配列オブジェクトは は,評価される単項演算子のオペランドとして使用してはならない。
C 2011 オンラインドラフト , 6.5.6/9
関連
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
ポインタ定数および定数ポインタ
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] Javascriptの配列に、指定された値に等しい属性を持つオブジェクトが含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] PHP を使って配列が空かどうかを確認する方法は?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
-
[解決済み] sizeof'(配列を指すポインタ)を見つけるにはどうしたらいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
ポインタ定数および定数ポインタ
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] 現在のCまたはC++の標準文書はどこにありますか?