あなたのコードに注意してください、
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になります。