为什么我们不能将 &数组传递给 &array[0] 可能的功能

why cant we pass &array to function where &array[0] is possible

本文关键字:array 功能 不能 我们 数组 为什么      更新时间:2023-10-16
void fun(int* array){}  

int main(){
int array[]={1,2,3};
fun(&array);----->(1)//error in this line
return 0;
}

error: cannot convert âint (*)[3]â to âint*â for argument â1â to âvoid fun(int*â).

如果我通过fun(&array[0]),它工作正常。根据我的理解,&array&array[0]都产生相同的地址。请澄清。

虽然任何聚合的地址(这意味着数组和标准布局类(都保证与第一个元素的地址相同,但类型是不同的,并且没有隐式转换。


举个例子,为什么不同类型的类型很重要和有用:

for( int *p = array; p < (&array)[1]; ++p )

遍历array的所有元素,而

for( int *p = array; p < (&array[0])+1; ++p )

仅执行一次。

在 C++11 中,如果您运行以下命令:

#include<iostream>
template<class T>
void foo(T t) {
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
   int arr[] = {1,2,3};
   foo(arr);
   foo<decltype(arr)>(arr);
   foo(&arr);
   foo(&arr[0]);
}

它将产生以下结果:

void foo(T) [with T = int*]
void foo(T) [with T = int [3]]
void foo(T) [with T = int (*)[3]]
void foo(T) [with T = int*]

有趣的是,数组默认折叠成指针(不确定这是 gcc 行为还是预期(。 但是,第二行显示arr的类型是int[3],因此&arr指向int[3]的指针,与int*不同。

它们不起作用,因为它们意味着不同的元素大小。索引一个int*会增加它的地址sizeof(int),因为它索引成一个int数组。索引一个int(*)[3]会增加它的地址sizeof(int) * 3,因为它索引成一个3个整数的数组数组。因此,即使起始地址相同,它们也是非常不同的类型,并且意味着非常不同的指针算法。编译器非常正确地告诉您它们不兼容。

数组在

传递时自然衰减为指针。您不必使用地址运算符。

您的类型不匹配。

该函数需要*int(指向 int 的指针(。

array&array[0]属于这种类型,*int.

&arrayint(*)[3] 类型(指向 3 个整数数组的指针(。

试试这个:

void fun(int* array){} // int *array is integer pointer so it can point to int not the int pointer. 
int main(){
int array[]={1,2,3};
fun(array); //remove &. now *array of pm point to array[0] i.e int.
return 0;
}