-6

这是代码:

#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*”类型的临时编译中对“int&”类型的非常量引用进行无效初始化,由于 -Wfatal-errors 而终止。

这意味着什么?我不明白错误信息......非常数的无效初始化?我用两个参数声明了上面的原型函数,一个是整数的引用,一个是整数值本身。我传递了 int 的引用(参见第 10 行),但这个错误一直在向我抛出。另外,它是如何“临时指针”的?

问题是什么?

4

3 回答 3

4

valint,&val是 的地址val, 是指向 的指针int。您的函数需要引用。你需要这样称呼它

mysize(val, 20);

并将签名更改为

void mysize(const int &size, int size2);

或者,甚至更好,

void mysize(int size, int size2);

因为你没有修改size.

于 2013-10-30T21:52:48.230 回答
1

您正在传递一个整数的地址,该地址mysize期望通过引用传递一个整数参数。将调用更改为:

mysize(val, 20); //remove &
于 2013-10-30T21:52:16.130 回答
0

指针和引用是有区别的。对于引用,假设编译器确实为您“获取地址”和“取消引用”,您不必(也不能)手动进行。另外,请注意&-operator 的不同含义。一些例子:

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);    

因此,对于参考,您不需要使用地址运算符&(它是隐式完成的),而您需要它作为指针。

于 2013-10-30T22:01:54.140 回答