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 の動作なのか、予期されているのかは不明です)。ただし、2 行目は、 の型が であることを示しておりarrint[3]ポインタ&arrint[3]は異なりint*ます。

于 2013-02-07T17:05:43.000 に答える
1

異なる要素サイズを意味するため、機能しません。にインデックスを付けると、 の配列にインデックスが付けられるため、int*そのアドレスが だけ増加します。にインデックスを付けると、3 つの int の配列の配列にインデックスが付けられるため、そのアドレスが だけ増加します。したがって、開始アドレスが同じであっても、それらは非常に異なる型であり、非常に異なるポインター演算を意味します。コンパイラは、それらに互換性がないことを伝えるのは非常に正しいです。sizeof(int)intint(*)[3]sizeof(int) * 3

于 2013-02-07T17:02:51.890 に答える
0

配列は、渡されると自然にポインターに減衰します。address-of 演算子を使用する必要はありません。

于 2013-02-07T16:58:36.453 に答える
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 に答える
0

タイプが一致しません。

*int関数は(int へのポインター) を期待します。

array&array[0]あり、そのタイプです*int

ただし&array、型int(*)[3](3 つの int の配列へのポインター) です。

于 2013-02-07T17:00:49.550 に答える