• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Scanf zla konwencja parametrow

Object Storage Arubacloud
–1 głos
204 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez idgu Nowicjusz (140 p.)
edycja 4 grudnia 2016 przez idgu

Męczy mnie pewna kwestia. Przykładowo, jeżeli tworzę  zmienną a i wskaźnik wskazujący na tą zmienną, to jeżeli chcę coś przypisać do tej zmiennej odwołuje się do jej wartości a nie adresu. np: 

 

#include <cstdio>

int main()
{
    int a, *wsk = &a;
    *wsk = 4;

    printf("%d", a);
    return 0;
}

 

Natomiast, jeżeli używam funkcji scanf, żeby przypisać do zmiennej jakąś wartość pobraną z klawiatury to jako drugi argument muszę już podać adres, a nie wartość! np: 

#include <cstdio>

int main()
{
    int a;
    scanf("%d", &a);

    return 0;
}

 

Rozumiem, że ta funkcja dodaje operator gwiazdki, ale jak dla mnie jest to szalenie nieintuicyjne. Jeżeli najpierw przyjmują konwencje, że aby zmodyfikować zmienną należy odwołać się do jej wartości a następnie każą podawać adres zmiennej w funkcji odpowiadającej za przypisanie danych z klawiatury do zmiennej to jest troszke nie na miejscu. Co o tym myślicie ?

2 odpowiedzi

+2 głosów
odpowiedź 4 grudnia 2016 przez criss Mędrzec (172,590 p.)
A jak inaczej w języku C chcesz umożliwić funkcji działanie na oryginale ?
komentarz 4 grudnia 2016 przez criss Mędrzec (172,590 p.)
I tu nie chodzi i żadne konwencje. Chcesz przypisać do zmiennej a? Musisz podać oryginał zmiennej a. Dość logiczne.
komentarz 4 grudnia 2016 przez idgu Nowicjusz (140 p.)
tak, tyle że operator & odnosi sie do adresu zmiennej, wiec powinno się w funkcji scanf podawac *&zmienna, bo podajac &zmienna wynika, że nie zmieniamy jej wartość tylko jej adres
komentarz 4 grudnia 2016 przez criss Mędrzec (172,590 p.)

Po pierwsze: nie można zmienić adresu zmiennej. Zmienna jest w pamięci w konkretnym miejscu i nic nie możesz z tym zrobić. Nie masz wpływu na to pod jakim adresem dana zmienna sie znajduje.

Podajemy adres zmiennej, żeby funkcja mogła pod ten adres się udać i modyfikować zmienną znajdującą się pod tym adresem. W języku C nie ma innej możliwości na umożliwienie funkcji modyfikowanie zmiennej.

wiec powinno się w funkcji scanf podawac *&zmienna

Lol, no jak chcesz, to się kłóć z twórcami języka i kompilatora i im mów jak powinni to zrobić XDD Podziwiam pewność siebie, ale nam tutaj na forum herezji nie siej, plox :P

Btw. *&zmienna znaczy to samo co po prostu zmienna. Serio, nie sądze żebyś miał jakiekolwiek podstawy do wykłócania się z twórcami biblioteki standardowej :-:

0 głosów
odpowiedź 4 grudnia 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

W języku C nie ma takiego narzędzia, jak referencje w języku C++. Dlatego, jeżeli chcesz zmodyfikować któryś z argumentów funkcji, musisz posłużyć się przekazywaniem poprzez wskaźnik.

W przypadku funkcji printf nie ma potrzeby modyfikacji zmiennych jako parametrów funkcji - wręcz przeciwnie, jest to przeciwwskazane. Bezpieczniej jest przekazać poprzez wartość, bo mamy pewność, że wartość zmiennej nie ulegnie zmianie.

W przypadku funkcji scanf sprawa ma się inaczej. Ona wczytuje dane z klawiatury i zapisuje odpowiednie wartości do zmiennej, czyli ją modyfikuje. W tym przypadku, argument musi zostać przekazany poprzez wskaźnik, aby umożliwić modyfikację zmiennej.

Podobne pytania

0 głosów
1 odpowiedź 1,998 wizyt
pytanie zadane 14 lutego 2018 w C i C++ przez n0s1gnal Użytkownik (700 p.)
0 głosów
3 odpowiedzi 1,147 wizyt
pytanie zadane 8 listopada 2016 w C i C++ przez Piotr Ponikwia Początkujący (330 p.)
–1 głos
2 odpowiedzi 228 wizyt
pytanie zadane 16 czerwca 2016 w C i C++ przez Pan Kulomb Pasjonat (18,630 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...