式type name[count]
が何らかの関数で記述されている場合、Cコンパイラにスタックフレームsizeof(type)*count
バイトに割り当てて、配列の最初の要素のアドレスを計算するように指示します。
式type name[count]
がすべての関数および構造体定義の外部で記述されている場合、Cコンパイラにデータセグメントsizeof(type)*count
バイトに割り当て、配列の最初の要素のアドレスを計算するように指示します。
name
実際には、配列内の最初の要素のアドレスを格納する定数オブジェクトであり、メモリのアドレスを格納するすべてのオブジェクトはポインターと呼ばれるためname
、配列ではなくポインターとして扱う理由です。Cの配列にはポインターを介してのみアクセスできることに注意してください。
if count
がゼロと評価される定数式である場合、スタックフレームまたはデータセグメントのいずれかにゼロバイトを割り当て、配列の最初の要素のアドレスを返すようにCコンパイラに指示しますが、これを行う際の問題は最初の要素長さゼロの配列は存在せず、存在しないもののアドレスを計算することはできません。
これは合理的な要素番号です。-length配列にcount+1
存在しないcount
ので、Cコンパイラが関数の内外で変数として長さ0の配列を定義することを禁止しているのはそのためname
です。どのアドレスにname
正確に格納されますか?
場合はp
、ポインタがその式はp[n]
同等です*(p + n)
右側の式にアスタリスク*は手段がが指し示すメモリアクセスポインタの参照解除操作である場合、p + n
そのアドレスに格納されたメモリやアクセスp + n
、p + n
ポインタの表現であるが、それはのアドレスを受け取りp
、このアドレスに番号を追加しn
、乗算ポインタの型のサイズp
。
アドレスと番号を追加することはできますか?
はい、アドレスは16進表記で一般に表される符号なし整数であるため、可能です。