Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用int(&;func())[5];工作,但int(*func())[5];是无效的吗?_C++_Syntax - Fatal编程技术网

C++ 为什么使用int(&;func())[5];工作,但int(*func())[5];是无效的吗?

C++ 为什么使用int(&;func())[5];工作,但int(*func())[5];是无效的吗?,c++,syntax,C++,Syntax,对我来说,它们似乎是相同的声明…int&func是一个引用,而int*func是一个指针。因为第一个是引用,所以需要将其初始化为int l值,例如a,如果它被声明为int a,无法分配。后者是一个指针,可以初始化/分配另一个int*,例如&a,如果它被声明为int aint&func是一个引用,而int*func是一个指针。因为第一个是引用,所以需要将其初始化为int l值,例如a,如果它被声明为int a,无法分配。后者是一个指针,可以初始化/分配另一个int*,例如&a,如果它被声明为int

对我来说,它们似乎是相同的声明…

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

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

两者都可以工作,但它们做的事情非常不同,就像引用和指针做的事情非常不同一样。“非常”取决于你和谁说话,但每个人都同意他们是不同的

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
}
typedef int int5[5];
int5&ref();
int5*点();
int5&var_ref=ref();
int5*var_point=point();
int5 a;//数组声明!
int5&ref(){return a;}
int5*point(){return&a;}
int main(){

这两种方法都有效,但它们做的事情非常不同,就像引用和指针做的事情非常不同。这“非常”取决于你和谁说话,但每个人都同意它们是不同的

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
}
typedef int int5[5];
int5&ref();
int5*点();
int5&var_ref=ref();
int5*var_point=point();
int5a;//数组声明!
int5&ref(){return a;}
int5*point(){return&a;}
int main(){

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

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

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

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

为什么你认为
int(*func())[5]
无效?它们不一样,但都是有效的。不要含糊其辞,做一个;写一个你在哪里遇到这个错误的代码?为什么你认为
int(*func())[5]
无效?它们不一样,但都是有效的。不要含糊其辞,做一个;写一个你在哪里遇到这个错误的代码?虽然这是真的(因此,我个人认为它不需要-1),这实际上与OP的代码没有任何关系。这些是函数声明,返回对/a的引用,指向5个整数的数组。这是真的(因此,我个人认为它不需要-1),这实际上与OP的代码没有任何关系。这些是函数声明,返回对/a的引用和指向5个整数数组的指针。