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