違い: ポインタ配列自体は配列であり、配列の要素はポインタです。つまり、配列はポインタを格納します。配列が占めるバイト数は配列自体によって決まります。配列ポインタ自体は配列を指すポインタです。つまり、配列へのポインタは、32 ビット システムでは常に 4 バイトを占有します。
このチュートリアルの動作環境: Windows7 システム、C99 バージョン、Dell G3 コンピューター。
多くの C プログラマは、ポインタ配列と配列ポインタの概念について混乱すると思います。サンプルコードは次のとおりです:
int *p1[5]; int (*p2)[5];
まず、ステートメント "int*p1[5]" については、"[]" が優先されるため、レベルは次のようになります。 "*" より大きいため、p1 は最初に "[]" と結合されて配列の定義が形成されます。配列の名前は p1 で、"int*" は配列の内容、つまり配列の各要素を変更します。 。つまり、図 1 に示すように、配列には int 型データへのポインタが 5 つ含まれているため、ポインタの配列になります。
2 番目に、ステートメント「int(*p2)[5]」では、「()」は「[]」よりも優先され、「*」はsign と p2 ポインタの定義を構成し、ポインタ変数の名前は p2 で、配列の内容、つまり配列の各要素を int で変更します。つまり、p2は、図2に示すように、5つのint型データを含む配列を指すポインタです。明らかに、これは配列ポインタですが、ここでは配列に名前がなく、匿名配列です。
ポインター配列の場合、まず第一に、それは配列であり、配列の要素はポインターであることがわかります。ポインタを格納し、配列が占有します バイト数は配列自体によって決定されます; そして配列ポインタの場合、まず第一に、それは配列を指すポインタ、つまり、配列へのポインタです。配列は 32 ビット システムでは常に 4 バイトを占有しますが、それについては、特定の状況に依存するため、指定された配列が何バイトを占有するかを決定することはできません。
ポインター配列と配列ポインターの違いを理解した後、引き続き次のサンプル コードを見てください。
int arr[5]={1,2,3,4,5}; int (*p1)[5] = &arr; /*下面是错误的*/ int (*p2)[5] = arr;
上記のサンプル コードでは、&arr が全体は配列の先頭アドレス、arrは配列の最初の要素の先頭アドレスを指し、意味は異なりますが、両者の値は同じです。次に、値が同じであるため、ステートメント「int(*p1)[5]=&arr」は正しいのに、ステートメント「int(*p2)[5]=arr」が何らかの条件下で実行されるのはなぜかという疑問が生じます。コンパイラ エラーメッセージが表示されます。
実は理由は非常に単純で、C言語では代入記号「=」の両辺のデータ型が同じである必要があり、異なる場合は明示的または暗黙的な型変換が必要となります。ここで、p1 と p2 は両方とも配列ポインターであり、配列全体を指します。 p1 の定義の「=」記号の両側のデータ型は完全に一致していますが、p2 の定義の「=」記号の両側のデータ型は一致していません (左側の型は配列全体へのポインタです) 、右側のデータ型は単一文字ポインタへのポインタであるため、エラー メッセージが表示されます。
関連する推奨事項: 「C 言語ビデオ チュートリアル 」
以上が配列ポインタとポインタ配列の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。