Void set_val(int i, int new_val) {
i = new_val;
}
int main() {
int i = 2;
set_val(i, 3);
}
Почему выдает 2, а не 3?
C/C++
Нужно объяснение по С
Для изменения значения внешней для функции переменной нужно использовать указатель. У вас внутри функции set_val переменная i становится равно 3, однако это никак не отражается на значение переменной i в min. При данной записи в функцию передаются копии переменных, а не сами переменные.
#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);
}
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);
}
в 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, тут всем нужно управлять в ручном режиме и весьма желательно понимать механизм работы используемых операций. :)
#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.
set_val(i, 3);
в функцию передается копия переменной int i.
Если хочешь изменить i, то нужно передать адрес, по которому i хранится. То бишь &i. По такому же принципу работает, например, и scanf.
Вся проблема в области видимости идентификаторов, в языке C переменные объявленные в параметре функции или внутри самой функции, они видны ток внутри данной функции, а точнее внутри фигурных скобок, другие функции доступ к этим переменным не имеют. Чтобы другие функции могли иметь доступ к переменной i её нужно объявить в самом вверху до начала определения других функций, так переменная i становится глобальной и её область расширяется, но использование глобальных переменных не рекомендуется т. к. это плохой тон программирования, для этих целей применяют указатели. Рекомендую скачать книгу "С для программистов
с введением в С11" в главе 5 там подробно про это объясняется и разжевывается.
с введением в С11" в главе 5 там подробно про это объясняется и разжевывается.
Похожие вопросы
- Составить программу на C++ если можно с объяснением.!
- Написать код на си .Желательно с объяснением
- Помогите решить задачу на СИ желательно с объяснением
- Сколько раз нужно взять остаток от деления числа на кол-во единиц в его двоичном представлении, чтобы получить 0
- Что нужно добавить в код, с++, очень нужно срочно
- Нужно написать программу вхождения точки в круг, при этом рассмотреть отдельно на границе и за пределами
- Помогите пожалуйста, срочно нужно!
- Нужно обьяснение кода
- Помогите пожалуйста со структурами. Нужно перебрать свойство структуры.
- С++, реализовать код с помощью функции, помогите пожалуйста, очень нужно