2017-12-21 21 views
1

誰かが以下の2つの関数宣言の違いを説明してもらえますか?私が知る限り、aDecay()は引数としてポインタをとり、整数がint a[5]の場合は、配列がポインタに崩壊するため、aDecay(a)またはaDecay(&a[0]を呼び出すことができます。C++値または関数の構文によるポインタを渡す

pDecay()に電話する場合は、pDecay(&a)を使用する必要があります。

pDecayはどのようにして&を使用する必要がありますか?普通a(またはその同等&a[0])で

void aDecay(int *p) 
void pDecay(int (*p)[7]) 

答えて

0

あなたは配列内単一要素へのポインタを持っています。 1つの要素のタイプはintなので、ポインタはint*でなければなりません。

&aのように、実際の配列へのポインタを持っている場合は、単一のint要素ではなく、配列全体へのポインタがありません。配列の型はint[5]であり、そのポインタはint(*)[5]です。

にものいずれの場合も、の配列を渡します。 ポインタを値渡しします。

+0

これは非常に明確です(今は明らかです)。ありがとうございました。 –

0

これは関数構文へのポインタではなく、配列構文へのポインタです。

pは、整数の配列へのポインタです。 p[i]は単一のintです。これ以上索引を付けることはできません。

pは、7つの整数配列の配列へのポインタです。 p[i]はさらに索引付けできる配列です。すなわち、p[i][0]が有効です。ここ

は、第二のアプローチを使用する例である:

void fill_data(int (*p)[7], size_t n) { 
    for (size_t i = 0 ; i != n ; i++) { 
     for (size_t j = 0 ; j != 7 ; j++) { 
      p[i][j] = (int)(7*i+j); 
     } 
    } 
} 

int main() { 
    int data[10][7]; 
    fill_data(data, 10); 
} 

Demo

0

aDecayintへのポインタを取ります。
intの配列は、配列の最初の要素へのポインタに減衰できます。

pDecayは、intの配列を指すポインタをとります。
配列は暗黙的に自身へのポインタに変換されません。

0

を渡すと、配列pが配列として保持されずにポインタに変換されます(これは配列がポインタに崩壊するため、配列の減衰と呼ばれます)。

それが実際にポインタであるので、大したことではない汎用ポインタにpへのポインタに変換されますので、ポインタにpを変換しません&pを渡します。

pをポインターに変換したくない理由は、配列がポインターではないためです。配列が単なるポインタであると考えるなら、sizeof(myArray)sizeof(myPointer)を比較してみてください。配列は、最初の要素へのポインタだけでなく、そのサイズも埋め込みます。

0

pDecayはどのように&を使用する必要がありますか?

配列はただのポインタに減衰しないので。具体的には、最初の要素へのポインタに減衰します。 int(即ちint[n])の配列の最初の要素へのポインタの種類がある:intへのポインタ(すなわちint*)。

pDecayの引数は、int (*p)[7]であり、これは7 intの配列へのポインタです。 int*は暗黙的に(int (*p)[7]に変換されません。それらは分離した互換性のないタイプです。 pDecay(&a)は、&aのタイプが(int (*p)[7]と異なるタイプの(int (*p)[5]であるため、どちらも機能しません。


pDecayは、一般的に&を使用するためにあなたを強制するものではありません。

int arr[n][7]; 
pDecay(arr); 

誰かがしてください以下これら二つの関数宣言の違いを説明してもらえ:?あなたはその後、pDecayが受け入れるものです最初の配列へのポインタに崩壊でしょう配列の配列を、渡すことができますか

int*は、intオブジェクトへのポインタです。 int (*p)[7]は、int[7]オブジェクトへのポインタ、すなわちの配列です。

0

まず第一に、あなたは問題の誤解があります。 - NOT pDecay(&a)aが配列の場合、aはつまり、あなたがpDecay(a)を行い、常にその配列へのポインタです。あなたがa[5]を言えば今、[ ]は逆参照操作ですので、 - あなたはa + 5 * bytes in memory occupied by the array's unitへのポインタデリファレンス。したがって、a&a[0]はまったく同じです。 a[5]&(a + 5)は同じです。

あなたの質問に答える、aDecay(int *p)は整数へのポインタを取ります - 何もここ配列を要求しません。 int (*p)[7]は7つの整数の配列であり、コンパイラはこれを確認します。

関連する問題