Я недавно начал изучать С++, и есть непонятки по взаимоотношениям массивов и функций. Буду признателен, если кто-то прояcнит картину.
Вопрос №1:
Объявил функцию типа
Код: Выделить всё
int (& f())[]{
int r[5];
// тут массив каким-то образом заполняется, и затем
return r;
}
Она возвращает ссылку, на созданный в ней массив, но как эту ссылку присвоить переменной?
Пробую совсем прямолинейно:
Не присваивает, мол, Lvalue подавай. Но блин, если у меня ссылка возвращается функцией, откуда я Lvalue возьму?
Хорошо, работаю с массивом по возвращаемой ссылке поэлементно:
Код: Выделить всё
int main(){
for (i = 0; i < 5; i++){
cout << f()[i]
}
}
Но это ж ужос получается, в этом случае функция f() выполняется на каждом шагу! А если у меня мильён элементов в массиве... Казалось бы, есть в памяти массив значений, есть адрес, в чём проблема, как работать с этим адресом?
В общем, кто что посоветует? Как получить ссылку на массив из функции в виде переменной?
Вопрос №2:
На самом деле функция f() получает в качестве аргументов два массива:
В учебниках пишут, что если вот так передавать массивы в функцию, то создаётся копия этого массива. Проверяю - нихрена подобного!
Адрес массива a[] внутри функции main() совпадает с адресом массива a[] в функции f(). Делаю вывод, функция работает с оригиналом массива. Получается, в книжках врут? Или это компилятор (CodeGear C++ Builder) опимизирует код?
Да, если это примитивные вопросы и ответ всё-таки легко получить в книжках - так и напишите. Хотя я искал и чё-та не нашёл.
Я недавно начал изучать С++, и есть непонятки по взаимоотношениям массивов и функций. Буду признателен, если кто-то прояcнит картину.
[b]Вопрос №1:[/b]
Объявил функцию типа
[code]int (& f())[]{
int r[5];
// тут массив каким-то образом заполняется, и затем
return r;
}[/code]
Она возвращает ссылку, на созданный в ней массив, но как эту ссылку присвоить переменной?
Пробую совсем прямолинейно:
[code]
int main(){
int m[5];
m = f();
}
[/code]
Не присваивает, мол, Lvalue подавай. Но блин, если у меня ссылка возвращается функцией, откуда я Lvalue возьму?
Хорошо, работаю с массивом по возвращаемой ссылке поэлементно:
[code]
int main(){
for (i = 0; i < 5; i++){
cout << f()[i]
}
}
[/code]
Но это ж ужос получается, в этом случае функция f() выполняется на каждом шагу! А если у меня мильён элементов в массиве... Казалось бы, есть в памяти массив значений, есть адрес, в чём проблема, как работать с этим адресом?
В общем, кто что посоветует? Как получить ссылку на массив из функции в виде переменной?
[b]Вопрос №2:[/b]
На самом деле функция f() получает в качестве аргументов два массива:
[code]int (& f(int a[], int b[]))[]{
}[/code]
В учебниках пишут, что если вот так передавать массивы в функцию, то создаётся копия этого массива. Проверяю - нихрена подобного!
[code]
int main(){
int a[5], b[5];
f(a, b);
}[/code]
Адрес массива a[] внутри функции main() совпадает с адресом массива a[] в функции f(). Делаю вывод, функция работает с оригиналом массива. Получается, в книжках врут? Или это компилятор (CodeGear C++ Builder) опимизирует код?
Да, если это примитивные вопросы и ответ всё-таки легко получить в книжках - так и напишите. Хотя я искал и чё-та не нашёл.