1
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]两者都产生相同的地址。请澄清。

4

6 回答 6

5

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


例如,为什么不同类型很重要且有用:

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

遍历 的所有元素array,而

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

只执行一次。

于 2013-02-07T16:58:45.450 回答
2

在 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 行为还是预期的)。但是,第二行显示的类型arrint[3],因此&arr指向int[3]不同于的指针int*

于 2013-02-07T17:05:43.000 回答
1

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

于 2013-02-07T17:02:51.890 回答
0

数组在传递时自然会衰减为指针。您不必使用 address-of 运算符。

于 2013-02-07T16:58:36.453 回答
0

你有不匹配的类型。

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

array并且&array[0]属于那种类型,*int

但是&array是类型int(*)[3](指向 3 个整数数组的指针)。

于 2013-02-07T17:00:49.550 回答
0

尝试这个:

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;
}
于 2013-02-07T17:03:31.257 回答