我有变量
UInt32 PageAddr = 0x80000000;
和功能
UInt8 Blank_Check(const UInt8 *Address)
我在对变量进行类型转换后调用函数。
Blank_Check((UInt8 *)&PageAddr);
将传递给空白支票的值是什么?我试图分析,但我无法理解它是如何工作的?
答案 0 :(得分: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 */
答案 1 :(得分:1)
传递的值是编译器将变量PageAddr
放入内存的地址。这是传递的值。
实际上,C是一种仅按值传递的语言。当您传递变量时,将传递变量的值。传递指针时,如&PageAddr
,PageAddr
的地址将成为传递的值。
稍后,在被调用的函数中,您可以使用地址值来查看或更改存储在该地址中的内容。
这与允许通过引用传递的语言形成对比,例如C ++或Java,其中传递对值的引用,在这种情况下,您对引用执行的任何操作实际上都是对原始变量执行的。