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;ihoo
中的cout“Parameterint*&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);
}