Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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数组[]传递给hoo(int*&p)?_C++_Arrays_Pointers_Reference_Lvalue - Fatal编程技术网

C++ 为什么可以';我们是否将int数组[]传递给hoo(int*&p)?

C++ 为什么可以';我们是否将int数组[]传递给hoo(int*&p)?,c++,arrays,pointers,reference,lvalue,C++,Arrays,Pointers,Reference,Lvalue,在我的理解中,int-array[]={1,2,3,4,5}中的array只是指向array的第一个元素的指针。这意味着数组可以分配给int*类型的指针ptr hoo中的参数int*&p将通过引用传递参数。这意味着我们可以将传递的参数更改为指向hoo中的另一个值 void hoo(int* &p, int n) { for (int i = 0; i < n; i++) cout << p[i] << endl; } int mai

在我的理解中,
int-array[]={1,2,3,4,5}
中的
array
只是指向
array
的第一个元素的指针。这意味着
数组
可以分配给
int*
类型的指针
ptr

hoo
中的参数
int*&p
将通过引用传递参数。这意味着我们可以将传递的参数更改为指向
hoo
中的另一个值

void hoo(int* &p, int n)
{
    for (int i = 0; i < n; i++)
        cout << p[i] << endl;
}

int main()
{
    int array[] = { 1,2,3,4,5 };

    // I can do this
    int* ptr = array;
    hoo(ptr, 5);

    // but not this.
    //hoo(array, 5);
}
void hoo(int*&p,int n)
{
对于(int i=0;i
这是不正确的。数组是数组,指针是指针。它们是具有不同属性的不同类型。它们经常被混淆,因为数组具有一个属性,它将急切地衰减为指向其第一个元素的指针

hoo(array,5);
试图将
array
转换为
int*
,但转换的结果是一个右值,不能绑定到非
const
引用。例如,如果您将
hoo
更改为采用
const
引用,则可以编译:

void hoo(int* const &p, int n) { }

int main()
{
    int array[] = { 1,2,3,4,5 };
    hoo(array, 5);
}

在这种情况下,您无法更改
p
指向的对象,从而使引用的使用毫无意义。

当函数采用
int*&
参数时,即(非移动)引用一个指向-
int
-的指针,则需要一个该引用引用的真正指针变量。它不能是临时指针值。因此,您不能执行以下操作:

int x;
hoo(&x, 123);

因为没有可引用的指针变量—只是临时变量。它与
int[5]
基本相同。实际上,任何地方都没有
int*
变量—只有5个
int
s。当您将
数组
传递给
hoo(),C++对该标识符的作用是:它实际上通过了<代码>和(数组[0)] < /C>。因此,就像前面的情况,它不会编译。< /P> < P>其他的答案已经解释了这个问题。我想建议改变编码实践。< /P>
使用
void hoo(int*&p,int n)
作为函数声明是一种非常古老的风格。使用模板,您可以让编译器推断大小并获得数组的引用,这样就无需使用指针

template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
    for (int i = 0; i < N; i++)
        cout << p[i] << endl;
}
如果您的函数还需要能够支持动态分配的数组,则可以按如下方式重载该函数

void hoo(int* p, size_t N)
{
    for (int i = 0; i < N; i++)
        cout << p[i] << endl;
}

template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
    hoo(p, N);
}
void hoo(int*p,大小N)
{
对于(int i=0;i
hoo
中的cout“Parameter
int*&p
将通过引用传递参数。这意味着我们可以将传递的参数更改为指向
hoo
中的另一个值如果您试图在
hoo
中执行
p=nullptr
,会发生什么情况?
array
的预期结果是什么?数组不是指向其第一个元素的指针。您的标题提出的问题与问题文本完全不同。您可以传递
int[]
改为
int*
,而不是改为
int*&
@tkausl我编辑了问题标题,它使你的部分评论无效。数组不是指针,句号。如果你把数组当作它的本来面目来对待,它会让你省去很多麻烦。是的,它在大多数情况下会衰减为指针,但不要把它当作指针。另外y、 你可以停止使用原始数组,用
std:array
代替它们。它们会解决类似的问题。你是想解决一些实际问题,还是只是为了学习?在这两种情况下,都可以使用
std::array
std::vector
,它们不会接受动态分配的数组它的用途非常有限。@Slava,没错。更新了答案。
void hoo(int* p, size_t N)
{
    for (int i = 0; i < N; i++)
        cout << p[i] << endl;
}

template <size_t N>
void hoo( int (&p)[N]) // The argument is a reference to an array of N elements.
{
    hoo(p, N);
}