Предупреждение: не делайте этого. Вот почему у нас есть векторы.
Если вы хотите создать массив данных и вернуть его из функции, как бы вы это сделали?
Очевидно, это не работает:
int [10] makeArray(int val)
{
int arr[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return arr;
}
Вы не можете вернуть массив из функции. Мы можем использовать указатели для ссылки на первый элемент массива, например:
int * makeArray(int val)
{
int arr[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return &(arr[0]); // Return the address of the first element.
// Not strictly necessary, but I don't want to confuse.
}
Это, однако, также не удается. arr - локальная переменная, она помещается в стек. Когда функция возвращается, данные больше не действительны, и теперь у вас есть указатель, указывающий на недействительные данные.
Что нам нужно сделать, это объявить массив, который будет существовать даже после выхода из функции. Для этого мы используем ключевое слово new, которое создает этот массив и возвращает нам адрес, который необходимо сохранить в указателе.
int * makeArray(int val)
{
int * arr = new int[10];
for(int i=0; i<10; ++i)
arr[i] = val;
return arr;
}
Затем вы можете вызвать эту функцию и использовать этот массив следующим образом:
int * a = makeArray(7);
for(int i=0; i<10; ++i)
std::cout << a[i] << std::endl;
delete [] a; // never forget this. Obviously you wouldn't do it right
// away like this, but you need to do it sometime.
Использование указателей с новым также дает вам преимущество в том, что вы можете определить размер массива во время выполнения, что вы не можете сделать с локальными статическими массивами (хотя вы можете это сделать в C):
int * makeArray(int size, int val)
{
int * arr = new int[size];
for(int i=0; i<size; ++i)
arr[i] = val;
return arr;
}
То, что использовало , было одной из основных целей для указателей. Но, как я сказал наверху, мы этого больше не делаем. Мы используем vector
.
Один из последних остатков указателей не для динамических массивов. Единственный раз, когда я их использую, это в классах, где я хочу, чтобы один объект имел доступ к другому объекту, не предоставляя ему право собственности на этот объект. Таким образом, объект A должен знать об объекте B, но даже если объект A исчез, это не влияет на объект B. Вы также можете использовать ссылки для этого, но не тогда, когда вам нужно дать объекту A возможность изменить какой объект у него есть доступ к.