在 C 中使用按引用传递时,有时传递给被调用函数的地址会发生变化:
void mainFunction()
{
BYTE aAddress[10];
readFunction(aAddress); // Address of aAddress: 0x111111
}
void readFunction(BYTE *pAddress) // Address of pAddress: 0x222222
{
...
}
我遇到的另一个问题,当使用按值传递时,被调用函数接收到的值与传递给它的值不同。
void mainFunction()
{
readFunction(0x20); // Passed value: 0x20
}
void readFunction(BYTE uValue) // Received value: 0x00
{
...
}
最佳答案
这完全取决于:您是如何打印地址的?如果您获得变量的地址,那么当然它们会有所不同。然而,指针指向的值将是相同的::
int main ( void )
{
char some_array[100];
printf("array holds: %p\n", (void*) some_array);//same
printf("Address in main: %p\n", (void*) &some_array[0]);//same
pass_arr(some_array);
return 0;
}
void pass_arr(char *arr)
{
printf("Address of pointer VAR: %p\n", (void *) &arr);//PRINTS DIFFERENT ADDRESS
printf("Pointer address: %p\n", (void *) arr);//same
printf("points to: %p\n", (void *) &(*arr));//same
}
check this codepad
您可能无法正确打印变量的地址,唯一正确的方法是使用 %p
占位符,将地址转换为 无效 *
。这是因为地址的打印方式取决于实现。
就是说,您提到了“通过引用传递”。 C 不通过引用传递,它没有 C++ 意义上的引用。但是为了让一个函数改变其他东西的值,你应该传递一个指向指针的指针:
struct some_str
{
int mem1;
size_t mem2;
};
int main ( void )
{
struct some_str *foo = malloc(sizeof *foo);
set_value(&foo);
free(foo);
return 0;
}
void set_value(struct some_str **change)
{//pointer to pointer
static int change_count = 0;
(*change)->mem1 = 123;
(*change)->mem2 = ++change_count;//for example
}
C 总是 按值传递,在指针的情况下,该值是内存地址,在基本类型的情况下 (int
, char
, long
...), 如果您传递指向变量 (&my_int
),您传递的不是变量,而是它在内存中的地址。这些是您必须从中选择的仅有的 2 个选项。
有关该主题的更多信息(数组与指针,以及为什么在大多数情况下数组会衰减为指针 you may find this link useful)
关于C - 按值传递和按引用传递不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21398874/