Keil C51 コンパイラを使用して 8051 マイクロコントローラをプログラムしています。なんらかの理由でコードが実行されませんでした。バグを突き止めることはできましたが、まだ理解に苦慮しています。他のコードと比較して、最初のコードが間違っているのはなぜですか? コンパイラがエラーをスローしなかったことは注目に値します。コードはマイクロコントローラー上で開始さえしませんでした。
不正なコード:
file1.h
extern STRUCT_TYPEDEF array_var[];
file2.c
// Global variable initialization
STRUCT_TYPEDEF array_var[] = some_struct.array2_var;
これらを次のように変更した後:
file1.h
extern STRUCT_TYPEDEF *array_var;
file2.c
// Global variable initialization
STRUCT_TYPEDEF *array_var = &some_struct.array2_var[0];
それは働き始めました。
また、コードのこの部分は「array_var[0].property = ...」などの関数でのみ参照されていましたが、これらの関数はいずれもアプリケーションから呼び出されていませんでした。
some_struct 変数は、さらに別のモジュールで宣言されています。
なぜそのように振る舞うことができたのでしょうか?[] と * の違いはありますか?
EDIT1: ポインターと配列は別物だと言われていますが、「[]」構文は「*」とどう違うのでしょうか? 角括弧が空の場合(関数の引数の場合と同様)、コンパイラはそれをポインターに変換するだけだと思いました。また、配列を提供すると、最初の要素のアドレスが得られると思いました。
現在、誰もがポインターと配列が異なると言っていますが、それらの正確な違いに関する情報は見つかりません。配列を最初の要素へのポインターではなく右辺値として指定すると、コンパイラーはそれをどのように認識しますか?