1

私は変数を持っています

UInt32 PageAddr = 0x80000000;

関数

UInt8 Blank_Check(const UInt8 *Address)

変数を型キャストした後に関数を呼び出しています。

Blank_Check((UInt8 *)&PageAddr);

空白のチェックに渡されるは何になりますか。分析しようとしましたが、どのように機能するのか理解できませんか?

4

2 に答える 2

2

短いバージョン:&文字を削除します。

長いバージョン:

まったく同じポインタ値になります。この型は、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 */
于 2012-12-17T10:23:31.370 に答える
1

PageAddr渡される値は、コンパイラーによって変数がメモリーに入れられたアドレスです。これが渡されたです。

実際、Cは値渡しのみの言語です。変数をパスすると、変数の値が渡されます。ポインタを渡すと&PageAddr、のアドレスPageAddrが渡される値になります。

後で、呼び出された関数で、address-valueを使用して、そのアドレスに格納されているものを検索または変更できます。

これは、値への参照が渡されるC ++やJavaのように、参照によっても渡すことができる言語とは対照的です。この場合、参照に対して、または参照を使用して行うことはすべて、実際には元の変数に対して行われます。

于 2012-12-17T10:32:43.310 に答える