1

私はあなたに余剰読書の退屈をすべて救うために追跡に切り込みます:

私は、オブジェクト/クラスの動的配列に関するチュートリアルを探してインターネットを組み合わせようとしました。ここでは、ポインターがどのように実装されているかを説明しています。これは特に:TheClass **foo[10];またはそのようなものですが、2つの星/アスタリスクが何に適しているのか、それらがどのように使用されているのかわかりません。そして、一般的にこのすべて。

動的配列がどのように宣言されるか、通常のポインターがどのように使用されるか、クラスを作成する方法、クラスの動的配列を作成する方法を知っています。しかし、これらすべてを組み合わせると、私は混乱しました。

だから私の質問は:

  1. これは何をし、どのように機能しますか?

  2. この例/チュートリアルが見つかることを知っているサイトをお勧めできますか?

  3. これには、「ダブルポインタを使用した動的オブジェクト配列」などではなく、特定の名前が付いていますか?

  4. チュートリアルが思い浮かばない場合は、非常に簡単な例を示していただければ幸いです。

例えばのように

int *something;
int somethingElse = 10;
something = &somethingElse; /*Now when you change "somethingElse","something" 
                              will also change to the same number*/

少し超短い例とそのような説明をいただければ幸いです。=)

4

4 に答える 4

2

ポインタへのポインタを使用する最も単純な、多かれ少なかれ有用な例は、2次元配列です。だから例えば

//Create a pointer to (an array of) pointers to (an array of) ints
int** array2D;

//Create a array of pointers to (an array of) ints and assign it to the pointer
array2D = new int*[10];

//Assign each of the pointers to a new array of 10 ints
for(size_t i =0; i<10;i++) {
    array2D[i] = new int[10];
}

//Now you have an 2 dimensional array of ints that can be access by
array2D[1][3] = 15;
int test = array2D[1][3];

これがポインタへのポインタとは何か、そしてそれらがどのように機能するかを少し説明してくれることを願っています。

于 2013-01-11T23:41:53.457 に答える
1

さて、私はあなたが完全な答えを目指しているのを見ます、私はそれについての簡単な例をあげます。

「classfoo**[10]」の例のように、ポインタへのポインタの配列を定義する場合、次のように言います。

int numX = 100;
int numY = 1000;

Node **some[10];
    some[0] = new Node*[numX];
    some[0][0] = new Node[numY];

次に、それが意味することは次のとおりです。

第1レベルに10ノード**があります。したがって、Node **と入力するための10個のポインターがありますが、それらはまだ有用な場所を指していません。

これは、ポインタを格納するための10個の隣接するメモリ位置です。この場合、それらが何を指しているかは関係ありません。主に、ポインタ用のスペースを含む10フィールドだけです。

次に、これらの10個の「スペース」の最初のものを取り、100個のポインターの配列のアドレスをタイプNode*に割り当てます。

some[0] = new Node*[numX]; //numX = 100

これは実行時に実行および評価されるため、ユーザー入力またはアプリケーションロジックによって指定された変数値を使用して、配列(メモリフィールド)の次元を定義できます。

これで、Node *と入力する100個のポインターを指す10個のポインターのうちの1個がありますが、それでもブラックホールを指しています。

最後のステップで、Node型のオブジェクトを1000個作成し、それらのアドレスを100個のポインターの最初の1つにアタッチします。

some[0][0] = new  Node[numY]; //numY = 1000

上記の例では、これは[0][0][0]から[0][0][999]のみがオブジェクトであり、1000を使用して作成したことを意味します。

このようにして、指定したタイプの多次元配列を作成できます。全体を機能させるのは、最後の次元(3)で必要なものをインスタンス化し、[0][0][0]から[9][99][999]までに作成されたすべてのフィールドに一意のインデックスを付けるポインターを作成することです。 。

some[0][1]; // memory violation not defined
some[0][0]; // good -> points to a *Node 
some[0][0][0]; // good -> actually points to Node (data)
some[1][0][0]; // memory violation not defined 

私の知る限り、ほとんどの場合、2次元配列をシミュレートするために、1次元配列といくつかの小さな数学を使用します。要素[x][y]= [x + y*width]と言うように;

しかし、あなたはあなたの記憶を使いたいと思っています、結局それはすべていくつかの記憶アドレスとそれらの内容に要約されます。

于 2013-01-12T00:03:14.963 に答える
1

ポインタは、まあ、ポインタです。それは何かを指しています。限目。それだけ理解すれば、ポインタへのポインタが何であるかを理解できるはずです。それは、それ自体が他の何かへのポインタである別の変数のメモリアドレスを値とする単なるポインタです。それで全部です。ミックスにを追加するたび*に、それはポインターの間接化の別のレベルにすぎません。例えば:

int i;
int* p_i = &i; // p_i is a pointer to an int and points at i
int** pp_i = &p_i; // pp_i is a pointer to an int* and points at p_i
int*** ppp_i = &pp_i; // ppp_i is a pointer to an int** and points at pp_i

次に、その概念をに適用しますTheClass **foo[10];(これは、実際にTheClass** foo[10];はコンパイラーの観点からです)。fooこれは、 10個TheClass**のポインター間要素を含むという名前の配列を宣言しています。それぞれTheClass*が特定のTheClassオブジェクトへのポインターである場合もあれば、TheClass要素の動的配列である場合もあり(コンテキストがなければ知る方法はありません)、それぞれTheClass**が特定のポインターへのTheClass*ポインターです。

于 2013-01-12T00:03:38.527 に答える
0
TheClass** foo[10];

fooこのコード行は、型の10個の要素からなる配列を作成するようにコンパイラーに指示しpointer to (pointer to Theclass )ます。

一般に、複数のアストリスク、アンパサンドを含むタイプを把握したい場合。左から右に読んでください。したがって、上記のコードを次のように分割できます。

   (  (Theclass)  *  )  *  foo[10] 
          ^       ^     ^    ^   ^
          5       4     3    2   1

#1 an array of 10 elements named #2 foo #3 of type pointer #4 to pointer #5 to Theclass 
于 2013-01-11T23:40:09.797 に答える