【发布时间】:2021-02-19 16:26:28
【问题描述】:
通常,这会被编译器捕获。但是使用对函数指针的强制转换我们可以做到这一点。
我可能措辞不当,这里有一个例子可以更好地说明我的问题:
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 OK?这种未定义的行为是否恰好适用于我的实现?如果不是,如果我们只传递它的地址,参数int &i 如何绑定到对象a,为什么它拒绝我标记为ERROR 2 的内容?
PS:在这个问题上我能找到的最好的方法是 this,它声称 printintp 和 printint “功能相同”,尽管在实践中,函数调用是不同的(printintp(&a) 和 @ 987654333@).
PS2:请注意,我不是在问指针和引用之间的区别,这已经很解释了here。
【问题讨论】:
标签: c++ pointers reference parameter-passing