packa Wrote:Прошло слишком много времени (для меня) без практики, поэтому такие тонкости давно забыл
Это не "тонкости", это вообще должно быть на уровне гигиены Как "помыть руки перед едой". Если переменная содержит размер чего-либо (неважно чего), или же переменная является индексом массива - то её обязательно нужно объявлять как unsigned.
packa Wrote:Менять переменные через функцию меня Шуруп научил (за что ему огромное спасибо) Через ссылки.
Передача по ссылке - это хорошо, но попробуй и передачу переменной (обычной переменной, не массива) через указатель.
void adding_function(int* variable) // функция добавляет 2 к переданной в неё переменной, изменяя при этом саму переменную { *variable += 2; // переменная предварительно разыменовывается, дабы изменялось её значение, а не значение указателя на неё }
int main() { int A = 8; adding_function(A); // неправильный вызов функции - нужно передавать не значение переменной A, а её адрес. adding_function(&A); // правильный вызов - передан адрес переменной A. После исполнения функции, A станет равно 10. }
Что такое указатель вообще? Это переменная, которая хранит какой-то адрес в ОЗУ (как правило, адрес какой-то другой переменной). Соответственно, если указатель фигурирует среди параметров функции (как в случае с adding_function) - то эта функция требует себе именно адрес какой-то переменной, а не её значение. Поэтому я и пишу adding_function(&A), ведь знак амперсанда - это операция "взятия адреса переменной".
А внутри тела самой функции написано *variable += 2, то есть идёт "разыменование указателя" (то есть, "обращение к значению переменной, на которую указывает указатель").
gamecreator Wrote:речь об одномерном массиве
Сорри, не заметил.
gamecreator Wrote:если мне нужен массив неизвестной или переменной длины (или возможность управлять указателями на массивы), то я выделяю память. если определенной длины - объявляю массив.
Создавать объекты в куче без особой надобности плохо, потому что это часто приводит к утечкам памяти. Например, после такой инициализации нельзя делать return - будет явная утечка памяти, равно как и при break с continue. Именно поэтому и придумали смарт-пойнтеры, чтобы вообще с кучей не работать...
P.S. Кстати, призываю всех пользоваться тегами [рhр][/рhр] для сишного кода - он его очень хорошо понимает, читать код с подсветкой намного приятнее.