0

2 つの質問があります。

1) 整数のオブジェクトを指す配列を作成するにはどうすればよいですか?

int* myName[5];  // is this correct?

2) オブジェクト ((1) など) を指す配列へのポインターを返したい場合、メソッドでこれを行うにはどうすればよいですか? ie) メソッドを実装したい:

int **getStuff() {
// what goes here?
return *(myName); // im pretty sure this is not correct
}

助けてくれてありがとう!

4

6 に答える 6

5

オブジェクトを指す配列を作成するにはどうすればよいですか?

int * myName[5]; /* correct */

オブジェクト ((1) など) を指す配列へのポインターを返したい場合、メソッドでこれを行うにはどうすればよいですか?

技術的には、この関数を次のように記述します。

int * (* getStuff() )[5] {
    return &myName;
}

それはその配列へのポインタを返します。しかし、あなたはそれをしたくありません。配列の最初の要素へのポインターを返したい場合:

int ** getStuff() {
    return myName; /* or return &myName[0]; */
}

そうすれば、好きなようにアイテムにアクセスできるようになりましたgetStuff()[0] = &someInteger;

于 2008-11-26T00:55:05.760 に答える
2

あなたのコードに注意してください、

int* myName[5];

5つの値を含む配列を宣言します。各値は「intへのポインタ」であり、これはあなたが求めたものです。

ただし、これはC ++であるため、これですべてです。Pythonスクリプターとして、それはあなたにいくつかの驚きを引き起こすかもしれません。

これらの5つのポインターのいずれにも適切な値は与えられず、それらが指す整数も作成されません。

関数本体に配置すると、スタック上に配列が作成されます。これは、現在のスコープが終了すると配列が存在しなくなることを意味します(簡単に言うと、囲んでいるclose-curlyに到達すると、たとえばreturnがそれを実行します)。したがって、特に、次のコードは不適切です。

int **myFunction() {
    int *myArray[5];
    return myArray;
} // <-- end of scope, and return takes us out of it

コンパイルされる可能性がありますが、関数は、呼び出し元がそれを見るまでに存在しなくなったものへのポインターを返します。これは、私たちが「未定義動作」と呼ぶものにつながります。

配列が作成された関数の外部に存在するようにしたい場合は、関数が呼び出されるたびにヒープ上に配列を作成し、次のようにポインターを返すことができます。

int **myFunction() {
    int **myArray = new int[5];
    return myArray;
}

この関数は、呼び出されるたびに異なる配列を返します。呼び出し元がそれを終了すると、次のように配列を破棄する必要があります。

delete[] myArray;

そうしないと、解放されることはなく、メモリを永久に使い果たしてしまいます(または、ほとんどのOSでプログラムが終了したときに)。

または、キーワード「static」を使用して、「グローバルストレージ期間」の配列を作成することもできます(つまり、プログラムが実行されている限り存在しますが、毎回新しい配列ではなく、1つしかありません)。つまり、関数は呼び出されるたびに同じ配列を返します。呼び出し元は、いくつかのポインターをその中に格納し、それを忘れて、関数を再度呼び出し、同じポインターがまだそこにあることを確認できます。

int **myFunction() {
    static int *myArray[5];
    return myArray;
}

このコードが以前の非常に悪いコードにどれほど似ているかに注意してください。

最後に、整数へのポインタの配列ではなく、整数の配列を作成するだけの場合は、次のように実行できます。

int myArray[5] = { 1, 2, 3, 4, 5};

これは実際に5つの整数を作成します(つまり、整数値自体を格納できるスペースを割り当てます。これは、整数値を格納するために使用されるスペースのアドレスを格納するポインターの配列とは異なります)。

また、指定された値をそのスペースに格納します。myArray[0]は1になり、myArray[1]は2になります。

于 2008-11-26T02:44:19.097 に答える
1

1) 正しい - これはintsへの 5 つのポインターの配列です。

2) 配列intの最初の要素へのポインターを返すことにより、s へのポインターの配列へのポインターを返すことができます。これには 2 つのレベルの間接性があるため、2 つのアスタリスクが必要です。配列は自動的に最初の要素へのポインターに分解されるため、通常どおり配列を返すこともできます。

int **getStuff() {
    return myName;       // 1
    return &myName[0];   // 2
}
于 2008-11-26T00:55:27.833 に答える
1
int **myName;

int **getStuff() {
  int **array = new int*[5];

  for (int i = 0; i < 5; i++)
  {
    int key = i;
    array[i] = &key;
  }

  return array;
}
于 2008-11-26T00:57:47.113 に答える
0

これは、テスト可能で削除可能なヒープ配列ポインター (要素へのポインターではありません) を返します。何も漏れません。

template <class T>
T* newarray(int len)
    {
        T *a;
        try
           {
               a = new T[len];
               memset(a,0,len*sizeof(T));
               return a;
           }
        catch (...)         
           {return 0;}
    }   

. . .

void foo()
    {
        float *f=0;
        f=newarray<float>(1000000);
        if(!f) return;
        //use f
        delete [] f;
    }
于 2012-08-06T20:28:01.340 に答える
0

スティーブ・ジェソップ、あなたは次のことを意味していたと思います:

int **myFunction() {
    int **myArray = new int*[5];
    return myArray;
}
于 2008-11-26T14:55:36.127 に答える