Обратите внимание, что ваш код,
int* myName[5];
объявляет массив, содержащий 5 значений, каждое из которых является «указателем на int», о чем вы и просили.
Однако, это C ++, вот и все, что он делает. Как сценарист Python, это может вас удивить.
Он не дает ни одного из этих 5 разумных значений указателей и не создает целых чисел, на которые они могут указывать.
Если вы поместите его в тело функции, то он создаст массив в стеке. Это означает, что массив прекратит свое существование, когда закончится текущая область (что, проще говоря, означает, что вы попадаете в закрывающее окружение, как это делает, например, 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;
в противном случае он никогда не будет освобожден и будет постоянно использовать память (или когда ваша программа завершит работу в большинстве ОС).
В качестве альтернативы, вы можете использовать ключевое слово «static» для создания массива с «глобальным сроком хранения» (это означает, что он существует до тех пор, пока работает программа, но каждый раз есть только один из них, а не новый) , Это означает, что функция возвращает один и тот же массив при каждом вызове. Вызывающий может сохранить в нем несколько указателей, забыть об этом, снова вызвать функцию и увидеть те же самые указатели, которые все еще там:
int **myFunction() {
static int *myArray[5];
return myArray;
}
Обратите внимание, насколько этот код похож на очень плохой код из предыдущих.
Наконец, если вы просто хотите создать массив целых чисел, а не массив указателей на целые числа, вы можете сделать это:
int myArray[5] = { 1, 2, 3, 4, 5};
Это фактически создает 5 целых чисел (то есть, он назначает пространство, в котором могут храниться целочисленные значения. Это отличается от массива указателей, в котором хранятся адреса пространства, используемого для хранения целочисленных значений).
Он также сохраняет указанные значения в этом пространстве: myArray [0] теперь равно 1, myArray [1] равно 2 и т. Д.