Объявление функции в си
Автор Simon Carptur задал вопрос в разделе Другие языки и технологии
Оператор return в СИ и получил лучший ответ
Ответ от Алекс Красс[гуру]
Оператор return возвращает то, что ты укажешь ему.
Оперируют в большинстве только со возвращаемым значением локальной переменной.
Можно вернуть и саму переменную, но... !
Если ты выходишь из функции, память выделенная под локальные переменные становиться недоступной (освобождается) и при обращение к ней ОС тебя выкинет с ошибкой. Поэтому с самой переменной обращаться бессмысленно.
Это будет понятно, когда дойдешь до указателей и взятие адресов.
int* z(){
    int a=10;
    return &a;
}
int main(){
    printf("%x
",z()); //Адрес, который был у переменной
     int* p = z(); //При новом обращение адрес может быть и другой.
     printf("%x
",p);
     //*p = 10; //попытка обращения к освобожденному адресу вызывает ошибку ОС в этой строке
    _getch();
}
P.S. Переменная имеет вид пары: (адрес : значение)
return всегда возвращает значение (число) , тип этого значения определяется самой функцией из которого вызывается return.
Переменная передаётся по значению. Потом нужно работать с той переменной, которой это значение присвоено во внешнем блоке кода.
Правда, сама переменная возвращается, если мы возвращаем массив, он передаётся по указателю.
Мы возвращаем значение переменной, присваивая его имени функции.
С заданной в функции переменной в main мы можем работать только если создали ее в динамической памяти, конечно, при этом придется передать наружу любым из возможных способов и ее адрес.
Переменную нельзя вернуть. Возвращается в любом случае какое-то значение. Если нужно получить адрес переменной в памяти (например, записать туда что-то, чтобы изменить переменную) , то есть оператор &. Переменные, объявленные в функции, перестают существовать при выходе из функции.
В "классическом" C всегда возвращается значение.
В C99 возможно возвращать значение референса, в некотором смысле - "самой переменной", соотв. в этом случае нельзя возвращать внутренние (временные) переменные, только статические.
Это если функция определена как-то так:
int& fun();
оператор return возвращает _значение_ типа, указанного при объявлении функции, ни о каких переменных и речи не идет, нужно помнить о том, что возвращать указатели нужно на память выделенную в общей куче а не локально, т. е. нельзя возвращать указатели на локальные переменные функций .
int f1 () { return 1; } // ok
int f2 () { int x = 1; return x; } // ok
int* f3() { int x = 1; return &x; } // BAD
int* f4() { static x = 1; return &x; } // ok
int* f5() { int *x = (int*) malloc(sizeof(int)); return x; } // ok
int* f6() { int x[16]; x[0] = 1; return x; } // BAD
int* f7() { int *x = (int*)malloc(sizeof(int) * 16); x[0] = 1; return x; } // ok
речь я так понимаю про чистый C, далее сюда еще добавятся references, их поведение аналогично указателям в данном аспекте:
int& f8() { int x = 1; return x; } // BAD
int& f8() { static x = 1; return x; } // ok
Можно забабахать функцию. С ней будет переменная, а ретурн вернёт функции значение, которое мона будет юзать потом. Оч полезно