Сообщение от
slonegd
Вкратце. Все переменные лежат в памяти контроллера определенным образом. Когда мы пишем iVar:=128. Мы записываем в ячейку памяти, к которой привязано имя этой переменной число 128. Это для машины, человеку удобнее пользоваться именем переменной. Функция adr(iVar) возвращает как раз адрес этой переменной. Если вы в функциональный блок передали адрес переменной, а не переменную, то меняя её внутри блока (там свои правила написания через указатели тогда), вы меняете её именно в этой ячейке памяти, а не её копию внутри блока, а значит меняешь внутри - меняется и снаружи. Подобное поведение и у var_in_out, рекомендую пользоваться именно var-in-out, ошибок будет меньше.
Указатели необходимы, к примеру, для создания функций работы с массивами. Только с помощью указателей можно написать универсальную функцию, к которой не привязан конкретный размер массива. В функцию надо передать указатель на первую ячейку массива с помощью ADR() и его размер с помощью SIZEOF() (еще и SIZEOF() ячейки массива - но это уже детали реализации). var-in-out для этого не подходит, потому что необходимо указывать размер массива в описании этого массива, а значит для массивов разной длины будет своя функция.
Попробуйте написать функцию сортировки массива с любыми целочисленными типами данных, где размер массива может быть любой, не используя указатели.