为什么是int(& func())[5];但是工作但是int(* func())[5];是无效的?

时间:2010-11-11 07:26:59

标签: c++ syntax

它们似乎与我的声明相同......

3 个答案:

答案 0 :(得分:5)

两者都有效,但它们做的事情非常不同,就像引用和指针做的事情完全不同。 “非常”取决于你与谁交谈,但每个人都同意他们的不同。

int (&ref())[5];
int (*point())[5];

int (&var_ref)[5] = ref();
int (*var_point)[5] = point();

使用typedef具有相同的含义,这可能会更清楚:

typedef int int5[5];

int5& ref();
int5* point();

int5 &var_ref = ref();
int5 *var_point = point();

int5 a;  // array declaration!
int5& ref() { return a; }
int5* point() { return &a; }

int main() {
  cout << var_ref[0] << '\n';       // prints 0
  cout << (*var_point)[0] << '\n';  // prints 0
}

注意指针的额外间接,返回并使用它。当你试图从一个切换到另一个时,你可能会把它遗漏掉,导致你收到的消息无效,但是如果没有更多的信息就无法告诉你。

答案 1 :(得分:0)

这不是一个答案,只是一些有助于讨论的代码。

static int ga[4] = { 49, 49, 42, 00 };
int (*get_ptr_ga())[4]
{
    return &ga;
}

int (&get_ref_ga())[4]
{
    return ga;
}

int main(int argc, char* argv[])
{
    int (*p) [4] = get_ptr_ga();
    int (&r) [4] = get_ref_ga();
    char sz[4];
    sz[0] = (*p)[2];
    sz[1] = r[2];
    sz[2] = '\n';
    sz[3] = 0;
    printf(sz);
    return 0;
}

答案 2 :(得分:-1)

int &func;是一个引用,int *func;是一个指针。因为第一个是引用,所以需要将其初始化为int l值,如果它被声明为a,则为int a;,并且无法分配。后者是一个指针,如果它被声明为int*,则可以初始化/分配另一个&a,例如int a;