В C, параметры, переданные по значению , например x
и y
в
void parse(char *line, int x, int y){
sscanf(line,"%d %d", &x, &y);
}
, являются копиями переменных, используемых вызывающей стороной в качестве параметров. Таким образом, любое присвоение, выполненное для них, не будет иметь никакого эффекта вне функции Почему вы видите эти странные ценности? Ну, поскольку parse
не влияет на x
и y
, они сохранят свои прежние значения. Но так как вы не инициализировали их, они будут иметь случайное значение в зависимости от того, что было ранее сохранено в их ячейках памяти.
Всякий раз, когда параметр является выходом функции (и по какой-то причине не может быть возвращен), он может быть передан как указатель : адрес переменной передан, так что выходные данные могут быть сохранены там.
В этом случае:
void parse(char *line, int *x, int *y){
sscanf(line,"%d %d", x, y);
}
и main
становится
int main(){
int x;
int y;
char *line = "2 3";
parse(line, &x ,&y); // <--- changes here!!!
printf("exponent = %d and number = %d\n",x,y);
return 0;
}
Итак:
- адресов исходных локальных переменных передаются.
- это можно сделать, потому что Я изменил
parse()
интерфейс, чтобы принимать указатели на целое число - в пределах
parse
, так как scanf
ожидает указатель на целое число для каждого %d
, я могу просто передать x
и y
вместо &x
и &y
как в вашей версии