C++ 将指针传递给带有引用参数的函数

C++ 将指针传递给带有引用参数的函数,c++,pointers,reference,parameter-passing,C++,Pointers,Reference,Parameter Passing,通常,这是由编译器捕获的。但是使用对函数指针的强制转换,我们可以做到这一点 我的措辞可能不恰当,以下是一个更好地说明我的问题的例子: void printintp(int *ip) { printf("pointer = %p\n", ip); printf("*pointer = %d\n", *ip); } void printint(int &i) { printf("int = %d\n", i

通常,这是由编译器捕获的。但是使用对函数指针的强制转换,我们可以做到这一点

我的措辞可能不恰当,以下是一个更好地说明我的问题的例子:

void printintp(int *ip)
{
    printf("pointer = %p\n", ip);
    printf("*pointer = %d\n", *ip);
}

void printint(int &i)
{
    printf("int = %d\n", i);
}

int main()
{
    int a = 555;
    //int &irp = &a;   // ERROR 1
    void (*f)(void *);

    //printint((int &) &a);   // ERROR 2
    f = (void (*)(void *))printintp;
    f(&a);
    f = (void (*)(void *))printint;
    //printint(&a);       // ERROR 3 (invalid conversion of `int *` to `int`)
    f(&a);              // GOOD (why?)
    return 0;
}
结果当然是人们所期望的:

pointer = 0x7ffd01995bf4
*pointer = 555
int = 555
因此,我的问题细化为:为什么要将指针
&a
传递给期望函数
printint
的对象?这种未定义的行为是否恰好适用于我的实现?如果不是,如果我们只是传递其地址,参数
int&i
如何绑定到对象
a
,为什么它拒绝我标记为
错误2

PS:在这个问题上我能找到的最好的说法是声称
printintp
printint
在功能上是“相同的”,尽管在实践中,函数调用是不同的(
printintp(&a)
printint(a)

PS2:请注意,我不是在问指针和引用之间的区别,这已经解释得很清楚了

这种未定义的行为是否恰好适用于我的实现

对。大多数编译器使用隐藏的指针实现引用,但这并不是由标准规定的

标准语法不允许指针按原样分配给引用,反之亦然,因此这些语句上会出现编译器错误

将所有内容都掷到
无效*
,所有赌注都押在类型安全上。使用a,你几乎可以逃避任何事情。你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。这就是为什么当您不知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。如果必须强制转换,请选择C++样式的类型强制转换,而不是(、等)。至少这样,您不会放弃太多的类型安全性

这种未定义的行为是否恰好适用于我的实现

对。大多数编译器使用隐藏的指针实现引用,但这并不是由标准规定的

标准语法不允许指针按原样分配给引用,反之亦然,因此这些语句上会出现编译器错误

将所有内容都掷到
无效*
,所有赌注都押在类型安全上。使用a,你几乎可以逃避任何事情。你基本上是在告诉编译器你知道你在做什么,所以它应该接受它并保持安静。这就是为什么当您不知道自己真正在做什么时,这种类型转换可能是危险的,除非绝对必要,否则应该避免。如果必须强制转换,请选择C++样式的类型强制转换,而不是(、等)。至少这样,您不会放弃太多的类型安全性