C/C++

Нужно объяснение по С

Void set_val(int i, int new_val) {
i = new_val;
}

int main() {
int i = 2;
set_val(i, 3);
}

Почему выдает 2, а не 3?
Pavel Pletnikov
Pavel Pletnikov
526
Для изменения значения внешней для функции переменной нужно использовать указатель. У вас внутри функции set_val переменная i становится равно 3, однако это никак не отражается на значение переменной i в min. При данной записи в функцию передаются копии переменных, а не сами переменные.
Вован Сычёв
Вован Сычёв
19 304
Лучший ответ
#include

void set_val(int* i, int* new_val)
{
i = new_val;
printf("i = %d", *i);
}

int main()
{
int i = 2;
int new_val=5;
set_val(&i, &new_val);
}
Oleg Matkovski
Oleg Matkovski
37 945
в C++ можно так

#include "stdio.h"

void set_val(int& i, int new_val) {
i = new_val;
}

int main() {
int i = 2;
set_val(i, 3);
printf("value %d",i);
}

а C не понимает reference, потому придется так:

#include "stdio.h"

void set_val(int* i, int new_val) {
*i = new_val;
}

int main() {
int i = 2;
set_val(&i, 3);
printf("value %d",i);
}

в инклудах треугольные скобки должны быть, но местный редактор тупой: ждет в них тег и escape символ не понимает. :)

и там, и тут суть в том, чтобы передавать не значение, а адрес памяти, по которому значение лежит. почему? потому, что при передаче значения в функцию все операции проводятся с его копией. копия объявлена в контексте функции, потому при очистке стека функции обнуляется и никуда не записывается. стало быть, чтобы значение сохранялось, его адрес должен быть за пределами стека функции. самое простое - на стеке родителя, как в моем примере. это C, тут всем нужно управлять в ручном режиме и весьма желательно понимать механизм работы используемых операций. :)
Где это интересно у тебя выдаёт, ты же нигде не выводишь?
при вызове
set_val(i, 3);
в функцию передается копия переменной int i.

Если хочешь изменить i, то нужно передать адрес, по которому i хранится. То бишь &i. По такому же принципу работает, например, и scanf.
Вся проблема в области видимости идентификаторов, в языке C переменные объявленные в параметре функции или внутри самой функции, они видны ток внутри данной функции, а точнее внутри фигурных скобок, другие функции доступ к этим переменным не имеют. Чтобы другие функции могли иметь доступ к переменной i её нужно объявить в самом вверху до начала определения других функций, так переменная i становится глобальной и её область расширяется, но использование глобальных переменных не рекомендуется т. к. это плохой тон программирования, для этих целей применяют указатели. Рекомендую скачать книгу "С для программистов
с введением в С11" в главе 5 там подробно про это объясняется и разжевывается.