3

まずa、10 個の要素を持つ配列を宣言します。次に、関数 bubbleSort を呼び出します。 bubbleSort( a, 10); ここで、bubbleSort は次のように宣言された関数です。 void bubbleSort(int* const array, const int size)

私の質問は、「配列」がポインターである場合です。つまり、配列のアドレスを格納したことを意味しますa( ) では、これらの用語, , ... を関数でarray= &a [0]どのように理解できますか?array[1]array[2]array[3]bubbleSort

それはバブルソートプログラムで、この部分は私にとって非常に紛らわしいです。

4

4 に答える 4

5

array[1]は、C 標準の定義により、 を意味します*(array+1)。したがって、arrayがポインターの場合、この式は 1 つの要素をポインターに追加し、その結果を使用して、ポイント先のオブジェクトにアクセスします。

が配列の場合、、、 などを配列の要素とa考えることに慣れているかもしれません。しかし、実際には、上記のポインターと同じプロセスを経て、1 つのステップが追加されます。コンパイラが配列を認識した場合、コンパイラは最初に配列をその最初の要素へのポインタに変換します。これは C 標準のルールです。実際そうです。次に、上記の定義が適用されます: is 、つまり、「a[0] のアドレスを取得し、1 つの要素を追加し、結果が指すオブジェクトにアクセスする」ことを意味します。</p> a[0]a[1]a[2]a[1]aa[1](&a[0])[1](&a[0])[1]*(&a[0] + 1)

したがって、一方が配列で始まり、もう一方がポインターを使用している場合でも、a[1]呼び出し元のコードと呼び出されたコードでは同じ結果になります。array[1]どちらも配列の最初の要素のアドレスを使用し、要素を 1 つ追加して、結果のアドレスでオブジェクトにアクセスします。

于 2013-05-06T01:55:17.783 に答える
4

C では、整数とポインターの加算と減算の演算が定義されており、総称してポインター演算と呼ばれます。言語仕様によると、ポインターに追加することは、ポインターが指すオブジェクトのサイズに等しいメモリ単位でNポインターを進めることと同じです。Nたとえば、ポインターに 10 を加算することintは、ポインターを 10 サイズ分進めることと同じintです。ポインターに 10 を足すことdoubleは、ポインターを の 10 サイズだけ進めることと同じdoubleです。

次に、言語はポインター演算の観点から配列添字操作を定義します。 を記述するarray[index]と、言語はそれを と同等のものとして扱い*((&array[0])+index)ます。

この時点で、言語は配列をポインターとして渡すために必要なすべてのものを備えています: take を&array[0]関数に渡し、関数がポインターで配列添字演算子を使用できるようにします。効果は、配列のサイズが使用できなくなることを除いて、配列自体が渡された場合と同じです。API の構造は、配列のサイズを別のパラメーターとして渡すことによって間接的に認識します。

于 2013-05-06T01:55:26.570 に答える
1

最初の要素のアドレスによって識別される int の配列があります。 array[1]これは*(array + 1)、「配列が指すものの値 + 1 つの要素のサイズ。これは、intプロトタイプを作成したため、int *

于 2013-05-06T01:55:50.020 に答える