Chcę odczytać numer ze standardowego wejścia. Nie rozumiem, dlaczego scanf
wymaga użycia &
przed nazwą mojego Zmienna:Dlaczego scanf wymaga &?
int i;
scanf("%d", &i);
Dlaczego scanf
potrzeba adres zmiennej?
Chcę odczytać numer ze standardowego wejścia. Nie rozumiem, dlaczego scanf
wymaga użycia &
przed nazwą mojego Zmienna:Dlaczego scanf wymaga &?
int i;
scanf("%d", &i);
Dlaczego scanf
potrzeba adres zmiennej?
Wymaga zmiany zmiennej. Ponieważ wszystkie argumenty w C są przekazywane przez wartość musisz przekazać wskaźnik, jeśli chcesz, aby funkcja mogła zmienić parametr.
Oto super-prosty przykład pokazujący go:
void nochange(int var) {
// Here, var is a copy of the original number. &var != &value
var = 1337;
}
void change(int *var) {
// Here, var is a pointer to the original number. var == &value
// Writing to `*var` modifies the variable the pointer points to
*var = 1337;
}
int main() {
int value = 42;
nochange(value);
change(&value);
return 0;
}
Bo inaczej byłoby zmieniając tylko kopię zamiast oryginału.
scanf wymaga operatora addressOf (&), ponieważ pobiera wskaźnik jako argument. Dlatego, aby przekazać zmienną, która ma być ustawiona na przekazaną wartość, musisz zrobić wskaźnik ze zmiennej, aby można było ją zmienić.
Powodem, dla którego wskaźnik musi zostać przekazany do scanf, jest to, że jeśli właśnie przekazałeś zmienną, nie możesz bezpośrednio zmienić zmiennej w scanf, więc nie możesz ustawić jej wartości odczytanej przez scanf.
Mam nadzieję, że to pomoże.
parametry funkcyjne C są zawsze „pass-by-value”, co oznacza, że funkcja scanf
widzi tylko kopię aktualnej wartości co można określić jako wyraz argumentów.
W tym przypadku &i
jest wartością wskaźnika, która odnosi się do zmiennej i
. scanf
może użyć tego do modyfikacji i
. Jeśli zdasz i
, zobaczysz tylko niezainicjowaną wartość, która (a) to UB, (b) nie jest wystarczającą informacją dla scanf
, aby wiedzieć, jak modyfikować i
.
scanf()
przechowuje wartości, więc potrzebuje miejsca do ich przechowywania.
Wykonuje się to, podając adresy (w wskaźnikach) gdzie przechowywać wartości za pomocą operatora addressof
lub & (ampersand).
sscanf nie wymaga &
int decimal;
int *pointer = &decimal;
scanf("%d", pointer);
powyżej kod jest ważny
To nie jest potrzebne.
char s[1234];
scanf("%s", s);
Działa dobrze bez jednego numeru &
w dowolnym miejscu. Co scanf
i firma potrzebują wskaźników. Aby umożliwić modyfikację konkretnej zmiennej, przekazujesz adres tej zmiennej. Dla kilku typów, które domyślnie występują. Dla innych używasz adresu &
, aby pobrać adres (uzyskaj wskaźnik do tej zmiennej).
Dajesz mu "* wskaźnik **. –