C 打字指针

C 打字指针,c,typecasting-operator,C,Typecasting Operator,我有一个变量 UInt32 PageAddr = 0x80000000; UInt8 Blank_Check(const UInt8 *Address) 和一个函数 UInt32 PageAddr = 0x80000000; UInt8 Blank_Check(const UInt8 *Address) 我正在调用函数after typecasting变量 Blank_Check((UInt8 *)&PageAddr); < >将传递给空白检查的值< /强>。我试图分析,但无法

我有一个变量

UInt32 PageAddr = 0x80000000;
UInt8 Blank_Check(const UInt8 *Address)
和一个函数

UInt32 PageAddr = 0x80000000;
UInt8 Blank_Check(const UInt8 *Address)
我正在调用函数after typecasting变量

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
的地址将成为传递的值

稍后,在调用的函数中,可以使用地址值查看或更改该地址中存储的内容


<>这与允许通过引用的语言形成对比,比如C++或者java,其中引用了一个值,在这种情况下,你对引用做了什么,或者引用了什么。实际上是对原始变量执行的。

运算符的地址
在函数调用中使用时,将采用变量
PageAddr
的地址,即不是其值
0x8000000
。您可能希望将其称为
空白检查((const UInt8*)PageAddr)是,如@anishsane所说。否,将传递指向0x8000000存储位置的指针(=地址)。
Blank_Check((UInt8 *)&PageAddr);