0

私は、ヘッダー ファイルに保存されている定義済みのフォント配列を使用して、ユーザー定義の文字列を受け取ってVGAモニターに出力するコードを扱っています。しかし、次のような他のソース コードでは理解できないコード行があります。

uint8_t *rowoftext ; 
char *text[20] = {"string1","string2",.......,"srting20"};

この行は実際に何をしますか?

rowoftext = (uint8_t *)text[textrow++];

uint8_t ポインターの配列を別のポインターに等化するにはどうすればよいですか? 私はそれをよく理解していますか、またはこの行は何をしますか?

4

4 に答える 4

5

ビット(uint8_t *)キャストと呼ばれます。ある型を別の型に変換します。この場合、あるポインター型を別のポインター型に変換します。ポイント先のオブジェクトに互換性がない場合、これは非常に危険ですが、この場合は互換性があります。

于 2013-10-02T16:49:40.027 に答える
0

詳細な説明:

uint8_t *rowoftext;
char *text[20] = {"string1","string2",.......,"srting20"};
  • uint8_t は (おそらく) ヘッダー ファイルのどこかに次のように定義されています。

    typdef unsigned char uint8_t;

  • rowoftext はポインターとして宣言され、uint8_t へのポインターとしてファイル スコープで定義され、NULL の既定値が割り当てられます。

  • text は、signed char へのポインターの配列として宣言され、32 ビット システムでは 80、64 ビット システムでは 160 の 20*sizeof(char*) の配列として定義されます。

コード行、

rowoftext = (uint8_t *)text[textrow++];
  • 変数 textrow の値を決定します (おそらく int または unsigned int として定義されます)
  • textrow 変数に格納されている値をインクリメントします
  • 配列 text の textrow 番目の要素を見つけ、そのアドレスを逆参照します。

    *(テキスト+テキスト行)

  • text[] の型が (char*) であるため、この式の型は (char*) です。

  • char へのポインター (char*) を、符号なしの別のポインター型 (uint8_t) に強制します。
  • 変更されていないポインタは変数rowoftextに格納されます

このステートメントの前にrowoftextを見ると、NULLまたは以前に割り当てられたポインター値が格納されていました。これで、変数 rowoftext には、text[textrow] に格納されたポインター (アドレス) が含まれます。

textrow の事後インクリメントにより、変数 textrow の値がインクリメントされましたが、インクリメント前の textrow の値が使用されていました。このイディオムは、C および C++ では非常に一般的です。

次の 2 つの宣言には違いがあります。

uint8_t *rowoftext;
uint8_t rowoftext[ integer_expression ];

1 つ目は、rowoftext をポインターを保持する変数として宣言します。ポインターは、配列のベース アドレスを割り当てることができ、ポインターをインクリメントすることで配列をトラバースするために使用できます。2 番目は、uint8_t 要素の配列への定数ポインターを宣言します。どちらの例も、[] 演算子で uint8_t の配列をアドレス指定するために使用できる変数 (sic) を宣言します。

rowoftext[ integer ]

これはと同等です

*(rowoftext + integer)
于 2013-10-04T02:56:04.320 に答える
0

キャストする場合は、キャスト前とキャスト後の両方のデータのサイズを考慮してください。サイズが大きい場合before cast > after castは、データが失われるため、これを行わないでください。

キャストでは、前後のサイズを計算します。

于 2013-10-02T16:54:20.607 に答える