以下是代码:
#include <iostream>
using namespace std;
void mysize(int &size, int size2);
int main()
{
int *p;
int val;
p = &val;
cout << p;
mysize(&val, 20); // Error is pointed here!
}
void mysize(int &size, int size2)
{
cout << sizeof(size);
size2 = size2 + 6000;
cout << size2;
}
以下是GCC的错误输出:
在函数'int main()'中: 第10行:错误:'int&amp;'类型的非const引用的无效初始化来自临时的'int *'类型 由于-Wfatal-errors而导致编译终止。
这意味着什么?我不明白错误信息......非常数初始化无效?我在上面用两个参数声明了原型函数,一个是整数的引用,另一个是整数值本身。我传递了int的引用(见第10行),但是这个错误一直被扔给我。另外,它如何“暂时成为指针”?
问题是什么?
答案 0 :(得分:4)
val
是int
,&val
是val
的地址,是指向int
的指针。您的函数需要引用。你需要像这样称呼它
mysize(val, 20);
并将签名更改为
void mysize(const int &size, int size2);
或者,甚至更好,
void mysize(int size, int size2);
因为您没有修改size
。
答案 1 :(得分:1)
您正在将整数的地址传递给mysize
,它希望通过引用传递整数参数。将呼叫更改为:
mysize(val, 20); //remove &
答案 2 :(得分:0)
指针和引用之间存在差异。对于参考,假设编译器为您执行“获取地址”和“取消引用”,您不必(也不必)手动执行此操作。另外,请注意&
- 运算符的不同含义。一些例子:
int a = 5;
int *pa = &a; // take address of a, store it in pa
int &ra = a; // define ra as a reference to a
// Function taking reference to long and pointer to int
void foo(long& a, int* b);
// Call it like this:
long myLong = 100;
int myInt = 10;
foo(myLong, &myInt);
因此,对于引用,您不需要使用地址运算符&
(它是隐含的),而您需要它作为指针。