为什么我们不能通过&数组来运行& array [0]是可能的

时间:2013-02-07 16:55:53

标签: c++

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

6 个答案:

答案 0 :(得分:5)

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


作为一个例子,为什么不同的类型是重要和有用的:

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

迭代array的所有元素,而

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

只执行一次。

答案 1 :(得分: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行为还是预期的)。但是,第二行显示arr的类型为int[3],因此&arr是指向int[3]指针,与{不同{ {1}}。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您的类型不匹配。

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

array&array[0]属于该类型*int

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

答案 5 :(得分: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;
}