C - 按值传递和按引用传递不一致

标签 c pass-by-reference pass-by-value

在 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/

相关文章:

c - 使用 syslog.h 将自定义时间戳写入 syslog

c - 我的数据会在这个 mutex/pthread_cond_wait 结构中丢失在哪里?

我可以进行优化,但不受重新排序语句的影响吗?

swift - Swift 函数是按值还是按引用分配/传递的?

c - 选择return 0 but data can be read

C++ 模板 - 可变参数模板和通过 const 引用传递

ruby - 参数是通过引用还是值传递给方法?

c++ - 通过引用隐式调用不兼容参数的复制构造函数?

c - 如何修改已传递给 C 函数的指针?

java boolean 值在被调用的方法中没有改变