私は変数を持っています
UInt32 PageAddr = 0x80000000;
と関数
UInt8 Blank_Check(const UInt8 *Address)
変数を型キャストした後に関数を呼び出しています。
Blank_Check((UInt8 *)&PageAddr);
空白のチェックに渡される値は何になりますか。分析しようとしましたが、どのように機能するのか理解できませんか?
私は変数を持っています
UInt32 PageAddr = 0x80000000;
と関数
UInt8 Blank_Check(const UInt8 *Address)
変数を型キャストした後に関数を呼び出しています。
Blank_Check((UInt8 *)&PageAddr);
空白のチェックに渡される値は何になりますか。分析しようとしましたが、どのように機能するのか理解できませんか?
短いバージョン:&
文字を削除します。
長いバージョン:
まったく同じポインタ値になります。この型は、Cコンパイラがポインタのインデックス付けと逆参照の方法を知るのに役立つためだけにあります。
値とポインタの違いを明確にするには、次のことを試してください。
UInt32 PageAddr = 0x80000000;
printf("%d, %p\n", PageAddr, &PageAddr);
変数の名前からすると、あなたは本当に次のようなことをしたいと思うでしょう。
Uint32* PageAddr = 0x80000000; /* as a pointer */
Blank_Check((UInt8 *)PageAddr); /* cast pointer to another kind of pointer */
または、ポインタを整数で表したい場合(ほとんどすべてのプラットフォームで機能しますが、100%移植性はありません)、次のようになります。
Uint32 PageAddr = 0x80000000; /* as an integer */
Blank_Check((UInt8 *)PageAddr); /* cast integer to pointer */
PageAddr
渡される値は、コンパイラーによって変数がメモリーに入れられたアドレスです。これが渡された値です。
実際、Cは値渡しのみの言語です。変数をパスすると、変数の値が渡されます。ポインタを渡すと&PageAddr
、のアドレスPageAddr
が渡される値になります。
後で、呼び出された関数で、address-valueを使用して、そのアドレスに格納されているものを検索または変更できます。
これは、値への参照が渡されるC ++やJavaのように、参照によっても渡すことができる言語とは対照的です。この場合、参照に対して、または参照を使用して行うことはすべて、実際には元の変数に対して行われます。