将数组的地址传递给 C++ 中的函数

Passing the address of an array into a function in C++

我是 c++ 的新手,我对将指针数组传递给函数的想法感到困惑。

这是函数

void func(int *a){ a[0]=999;}

主要使用

int main()
{
    int a[5]={1,2,3,4,5};
    func(a);
    std::cout << a[0]<< std::endl;
}

我理解这非常有效,因为数组的名称只是其第一个元素的地址。 根据我的理解,&a指的是整个数组的地址,而a指的是数组第一个元素的地址,应该和&a是一样的。 但是,如果我使用

int main(){
    int a[5]={1,2,3,4,5};
    func(&a);
    cout<< a[0]<< endl;
}

它returns编译错误:no known conversion from 'int (*)[10]' to 'int *' for 1st argument; remove &

谁能解释一下这是怎么回事?

案例一

I understand this works perfectly as the name of an array is just the address of its first element.

以上说法在技术上是不正确的。第一个示例之所以有效,是因为在许多情况下(包括将数组作为参数按值传递给函数时)由于 ,数组 衰减 指向指向其第一个元素的指针类型衰减。这意味着,在示例 1 中,当您将 a 作为参数传递时,有一个隐式 array-to-pointer 转换将类型 int[5] 的数组 a 转换为指向它的指针第一个元素是 int* 类型。因此在示例1中,参数的类型和参数的类型匹配并且示例1成功。

另请注意,即使衰减指针和数组地址都具有相同的值,但它们的类型不同。衰减指针的类型为 int*&a 的类型是 int (*)[5].

案例二

Could anyone please explain what's going on here?

这是因为 aint [5] 类型,这意味着 &aint (*)[5] 类型,与参数 [=14] 的类型不匹配=].

也就是说,当您修改代码时,您传递的 &aint (*)[5] 类型,但函数参数是 int* 类型,因此在参数的类型和你传递的参数,因为没有从 int (*)[5]int* 的隐式转换,我们得到提到的错误:

no known conversion from 'int (*)[5]' to 'int *'

I understand this works perfectly as the name of an array is just the address of its first element.

这是一个微妙的错误理解。数组 int[10] 可以隐式转换为指向第一个元素 int*(的地址)的指针。当您调用接受 int* 参数并传递 int[10] 参数的函数时,就会发生这种隐式转换。

&a refers to the address of the entire array while a refers to the address of the first element of the array, which should be identical to &a

指针的值是相同的。但是指针的类型不同。一个是指向数组 int (*)[10] 的指针,另一个是指向此类数组 int* 的元素的指针。两种类型都不会隐式转换为另一种类型,因此您不能将 &a 作为参数传递给需要 int* 的函数。语言的类型系统可以防止你犯错误。编译器诊断消息对此进行了解释。

a视为指针。它指向数组的第一个元素,a[0](或*a)。

那么&a就是指针的地址,与上面无关

注意(&a)[0]*(&a)return指针,而(&a)[0][0](*(&a))[0]*((&a)[0])**(&a) return数组的第一个元素。