Предупреждение: Не делайте этого. Вот почему у нас есть векторы.
Если вы хотите создать массив данных и вернуться, если от функции, как бы вы это сделали?
Очевидно, что это не работает:
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;
}
Это используется быть одной из главных целей для точки ERS. Но, как я сказал наверху, мы больше этого не делаем. Мы используем vector
.
Один из последних остатков указателей не для динамических массивов. Единственный раз, когда я их использую, - это классы, в которых я хочу, чтобы один объект имел доступ к другому объекту, не давая ему права собственности на этот объект. Таким образом, Object A должен знать об объекте B, но даже когда объект A отсутствует, это не влияет на объект B. Вы также можете использовать ссылки для этого, но не если вам нужно предоставить Object A возможность изменить какой объект у него есть доступ.
BASIC не поддерживает указатели: P – Thomas
@Thomas: Я думаю, что он имел в виду понимание основ указателей, а не BASIC. – Chan
У Альфа П. Штайнбаха была книга, которую он писал по этому вопросу, но все ссылки, которые я могу найти, теперь тупики. –