"просто указатель" не сработает если переменная физически перестает существовать за пределами зоны видимости (например, если она создается в стеке). Static нужен для того чтобы гарантировать ее сохранение.
Переменная по указателю создается не на стеку, а на куче. Хоть сам указатель и лежит на стеку. Указатель можно либо вернуть из функции, либо передать в аргументы функции, если там есть ссылка, и тогда эта переменная станет доступна снаружи.
Static? Да, потому что она имеет именно что локальную зону видимости. Просто сохраняется после использования.
Впрочем, мой вариант, с точки зрения синтаксиса языка, на зону видимости никак не влияет, так что, строго говоря, к теме пста тоже отношения не имеет. Чтоб он влиял на зону видимости - нужно добавить в него еще один костыль в виде #define который заменит имя переменной на обращение к ней по адресу. ЕМНИП, дефайн работает "отсюда и далее", так что если описать его в самом конце зоны видимости, после последнего обращения к переменной, то он не будет с ней конфликтовать. И такой вариант не будет читтерством )
Ну и соответственно динамическая память, созданная через new, не перестает существовать, выйдя за границы стека, потому что выделяется не на стеку. Вот пример на C++:
Цитирую доку: The out keyword causes arguments to be passed by reference. [...] It is like the ref keyword, except that ref requires that the variable be initialized before it is passed.
Так что это одно и то же. Да и в целом компилятор не обязан помещать переменные в стек - это же не C/C++, где при доступе за областью видимости будет UB или segfault. Так что это нормально - пусть значение живет отдельно от переменных, пока счетчик ссылок не обнулится или ее не съест сборщик мусора.
Впрочем, мой вариант, с точки зрения синтаксиса языка, на зону видимости никак не влияет, так что, строго говоря, к теме пста тоже отношения не имеет. Чтоб он влиял на зону видимости - нужно добавить в него еще один костыль в виде #define который заменит имя переменной на обращение к ней по адресу. ЕМНИП, дефайн работает "отсюда и далее", так что если описать его в самом конце зоны видимости, после последнего обращения к переменной, то он не будет с ней конфликтовать. И такой вариант не будет читтерством )
void foo(int*& a) {
a = new int();
}
The out keyword causes arguments to be passed by reference. [...] It is like the ref keyword, except that ref requires that the variable be initialized before it is passed.
Так что это одно и то же. Да и в целом компилятор не обязан помещать переменные в стек - это же не C/C++, где при доступе за областью видимости будет UB или segfault. Так что это нормально - пусть значение живет отдельно от переменных, пока счетчик ссылок не обнулится или ее не съест сборщик мусора.
JS - Новый PHP