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

C-传递值和传递引用不一致,c,pass-by-reference,pass-by-value,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 { ... } 我遇到的另一个问题是,在使用passby value时,被调用函数接收

在C中使用“按引用传递”时,传递给被调用函数的地址有时会更改:

void mainFunction()
{
  BYTE aAddress[10];
  readFunction(aAddress); // Address of aAddress: 0x111111
}

void readFunction(BYTE *pAddress) // Address of pAddress: 0x222222
{
  ...
}
我遇到的另一个问题是,在使用passby value时,被调用函数接收到的值与传递给它的值不同

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
}

您可能无法正确打印变量的地址,唯一正确的方法是使用
%p
占位符,并将地址强制转换为
void*
。这是因为地址的打印方式取决于实现


也就是说,你提到了“参考传递”。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
),则传递的不是变量,而是内存中的地址。这是你唯一可以选择的两个选项

有关此主题的更多信息(数组与指针,以及为什么在大多数情况下数组会退化为指针)

在C中使用“按引用传递”时,传递给被调用函数的地址有时会更改

-->不,看看这个密码

#include <stdio.h>

void readFunction (int *pAddress) 
{
    printf("Address of pAddress: %p\n", &pAddress);
    printf("Content of pAddress: %p\n", pAddress);
}

void main()
{
    int a[10];
    printf("Address of a: %p\n", &a);
    readFunction(a);
}

pAddress
位于另一个位置,但它仍然指向
a
的地址。这是通过引用传递的原语

在调用函数之前是否声明了它们?也就是说,在调用
main function
之前,您有一个
readFunction
的原型吗?在调用函数的位置之前,您有定义函数的原型吗?如果没有,请尝试将函数定义移动到调用它的位置上方。如果这解决了它,那么它不起作用的原因是因为编译器假设了函数的某些方面,并且假设不正确。严格来说,C语言中没有“通过引用传递”。如何输出地址<当使用
aAddress
调用
readFunction
时,code>pAddress是一个指针,它应该指向与
aAddress
相同的位置。首先,C只按值传递,而不按引用传递。。。按值传递指针就是按值传递。第二,发布代码,演示您的(极不可信)声明,因为您可能正在犯其他错误。(对初学者的一般提示:99.9%的时间是你的错,而不是工具的错。)最后,在编译时启用警告。。。您的示例有原型错误。@JoachimPileborg我在头文件中声明了函数,但仍然收到“隐式声明”警告。我要补充的一点是C只有传递值。。。传递指针就是这样一种形式;通过引用传递是不同的。@JimBalter:在我的答案中也添加了这一点。PS:也许把你的评论改为“99%都是你的错,操作中唯一的工具就是你”:)我会用数组以外的东西作为指针指向指针的例子。。。my_array不是指针,您不能更改它的值,my_array和&my_array在数字上相等(但大小不同)。@JimBalter:还有pass by text,但我们不讨论它=)@user324346“我如何获得传递的直接值的地址?”——这个问题没有意义;它似乎在询问如何获取诸如0x20之类的文本的地址。至少第五次:发布演示问题的真实代码。转换指针,并解释“这是按引用传递的原语”C语言不支持“按引用传递”。完全最接近的方法是按值传递指针。有些人坚持认为这构成了“按引用传递”,但这是不正确的。当使用
%p
转换传递指向要打印的
printf()
的指针时,指针必须始终转换为
(void*)
Address of a: 0xbfb94948
Address of pAddress: 0xbfb94930
Content of pAddress: 0xbfb94948