Другие языки программирования и технологии

Оператор return в СИ

При возвращении оператором return мы возвращаем ЗНАЧЕНИЕ переменной или САМУ переменную? Если саму то если мы переменную задали не глобально а в функции, мы с ней потом сможем работать в main()?
Оператор return возвращает то, что ты укажешь ему.
Оперируют в большинстве только со возвращаемым значением локальной переменной.

Можно вернуть и саму переменную, но... !
Если ты выходишь из функции, память выделенная под локальные переменные становиться недоступной (освобождается) и при обращение к ней ОС тебя выкинет с ошибкой. Поэтому с самой переменной обращаться бессмысленно.

Это будет понятно, когда дойдешь до указателей и взятие адресов.
int* z(){
    int a=10;
    return &a;
}

int main(){
    printf("%x\n",z()); //Адрес, который был у переменной
     int* p = z(); //При новом обращение адрес может быть и другой.
     printf("%x\n",p);
     //*p = 10; //попытка обращения к освобожденному адресу вызывает ошибку ОС в этой строке
    _getch();
}

P.S. Переменная имеет вид пары: (адрес : значение)
Ерлан Тайшабаев
Ерлан Тайшабаев
40 015
Лучший ответ
Мы возвращаем значение переменной, присваивая его имени функции.
С заданной в функции переменной в main мы можем работать только если создали ее в динамической памяти, конечно, при этом придется передать наружу любым из возможных способов и ее адрес.
BZ
Bekhzod Zakirov
64 007
Переменную нельзя вернуть. Возвращается в любом случае какое-то значение. Если нужно получить адрес переменной в памяти (например, записать туда что-то, чтобы изменить переменную) , то есть оператор &. Переменные, объявленные в функции, перестают существовать при выходе из функции.
Андрей Рябов
Андрей Рябов
75 747
return всегда возвращает значение (число) , тип этого значения определяется самой функцией из которого вызывается return.

http://en.wikipedia.org/wiki/Exit_status
http://en.wikipedia.org/wiki/Return_type
Bekhzod Zakirov Это неверно, и double, и вообще что угодно
Виталий Шевченко return может вообще ничего не возвращать.
В "классическом" 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