「Clockwise / Spiral Rule」として知られる手法により、プログラマーはC言語宣言を解析できます。
次の簡単な手順に従ってください。
1.未知の要素から始めて、スパイラル/時計回りの方向に移動します。 同時に、次の要素を適切なフレーズに置き換えます。
- [X]または[] =>タイプ...のサイズXの配列、またはタイプ...の未定義サイズの配列
- (type1、type2)=> type type1、type2を受け入れて返す関数...
- * =>へのポインタ...
2.すべての要素が完了するまで、らせん/時計回りに移動します。
3.括弧内の式を常に最初に許可します!
例1:シンプルな広告
+-------+<br>
| +-+ |<br>
| ^ | |<br>
char *str[ 10 ];<br>
^ ^ | |<br>
| +---+ |<br>
+-----------+<br>
strとは何ですか?
strは...
strで始まるスパイラル/時計回りに移動します。最初に表示される文字は '['で、これは配列です。
strは、タイプ10のサイズ10の配列です。
スパイラル/時計回りに動き続け、次に出会うのは記号「*」です。これはポインターがあることを意味します。
strは、サイズ10の配列で、...へのタイプポインターです。
らせん状に移動し、行の終わりを見るため、先に進み、「char」タイプを確認します。
strは、char型のポインターのサイズ10の配列です。
すべての要素、つまり それだけです、この式を作りました!
例2:関数ポインターの宣言
+--------------------+<br>
| +---+ |<br>
| |+-+| |<br>
| |^ || |<br>
char *(*fp)( int , float *);<br>
^ ^ ^ || |<br>
| | +--+| |<br>
| +-----+ |<br>
+------------------------+<br>
fpとは何ですか?
fpは...
らせん状/時計回りに移動し、最初に表示されるのは「)」です。 したがって、fpは角括弧内にあり、角括弧内でスパイラルを継続し、次の文字は「*」です。
fpは...
現在、括弧の外側にあり、らせん状に動き続けているため、「(」、つまりこれは関数であることがわかります。
fpは、intを受け取る関数へのポインターと...
らせん状に動き続けると、記号「*」に出会うので、次のようになります。
fpは、intを受け取る関数へのポインターと、...へのポインターを返すfloatへのポインターです。
らせん状に進むと、シンボル「;」に遭遇しますが、すべてのシンボルがまだ処理されていないため、続行して「char」などに遭遇します。
fpは、intを受け取る関数へのポインターと、charへのポインターを返すfloatへのポインターです。
例3:究極の
+-----------------------------+<br>
| +---+ |<br>
| +---+ |+-+| |<br>
| ^ | |^ || |<br>
void (*signal( int , void (*fp)( int )))( int );<br>
^ ^ | ^ ^ || |<br>
| +------+ | +--+| |<br>
| +--------+ |<br>
+----------------------------------+<br>
シグナルとは何ですか?
括弧内の信号に注意してください。まず、内部の式を解析する必要があります。 スパイラル/時計回りに移動すると、「(」などが表示されます。
signalは、intと...
うーん、シンボル「fp」で同じルールを使用できます。したがって、fpとは何ですか? fpも括弧内にあるため、続けて「*」が表示されます。
fpは...
スパイラル/時計回りに移動すると、「(」などが表示されます。
fpは、intを受け取り、...を返す関数へのポインタです。
スパイラル/時計回りの方向に移動すると、「ボイド」が表示されます。
fpは、voidを返すintを受け取る関数へのポインターです。
fpはこれで完了です。シグナルを続けましょう。次のようになりました。
signal-intを受け取る関数と、intを受け取り、voidを返し、...を返す関数へのポインター
私たちはまだ角括弧の中にいるので、次の文字は '*'です。
signal-intを受け取る関数、intを受け取る関数へのポインター、voidを返す、ポインターを返す...
角かっこ内の要素を許可し、らせん状に続けて記号「(」などを取得します。
signal-intを受け取る関数、intを受け取る関数へのポインター、voidを返す関数、intを受け取る関数へのポインターを返す...
最後に、私たちは動き続け、最後の文字で「ボイド」が表示されるため、完全な説明は次のとおりです。
signal-intを取り、intを取り、voidを返し、intを取り、voidを返す関数へのポインターを返す関数へのポインターを受け取る関数。
このルールは、constおよびvolatile属性の理解にも適用されます。 例:
const char * chptr;
それでは、chptrとは何ですか?
chptrはchar不変へのポインターです。
これはどうですか:
char * const chptr;
それでは、chptrとは何ですか?
chptrは、charへの不変のポインターです。
そして最後に:
volatile char * const chptr;
それでは、chptrとは何ですか?
chptrは、char volatileへの不変のポインターです。