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

question-closed Wskaźnik czy dobrze? Problem ze zwolnieniem pamięci;

Object Storage Arubacloud
–1 głos
441 wizyt
pytanie zadane 5 września 2016 w C i C++ przez hubercik Użytkownik (560 p.)
zamknięte 5 września 2016 przez hubercik

Witam! :) 

Czy kod tego o to "kalkulatora" na wskaźnikach jest dobry? Tzn. czy dobrze wykorzystałem wskaźniki :D




#include <iostream>
using namespace std;

int main()
{
    for(;;)
    {
    int x,y;
    int *e, *r;
    cout<<"Podaj pierwszą liczbę: ";
    cin>>x;
    e=&x;
    cout<<"Podaj drugą liczbę: ";
    cin>>y;
    r=&y;
        
    cout<<"Main menu:"<<endl;
    cout<<"1.Dodawanie"<<endl;
    cout<<"2.Odejmowanie"<<endl;
    cout<<"3.Mnożenie"<<endl;
    cout<<"4.Dzielenie"<<endl;
    cout<<"5.Wyjście"<<endl;
    cout<<"wybierz: ";
    int *w;
    int wybierz;
    cin>>wybierz;
    w=&wybierz;
    switch(*w)
    {
        case 1: cout<<"Suma="<<x+y<<endl;    break;
        case 2: cout<<"Różnica="<<x-y<<endl; break;
        case 3: cout<<"Iloczyn"<<x*y<<endl;  break;
        case 4: cout<<"Iloraz"<<x/y<<endl;   break;
        case 5: exit(0);
        
        default: { cout<<"Nie ma takiej opcji w menu, jestem zmuszony do zamknięcia programu!"<<endl; exit(0); } break;
            
    }
    
    }
   
    
    return 0;
}

Ps. Mam problem ze zwolnieniem pamięci w tym programie tzn. próbowałem na różne sposoby i coś mi nie wychodziło :D 

Z góry dzięki za odpowiedź :D

komentarz zamknięcia: Priv - rozwiązanie

2 odpowiedzi

0 głosów
odpowiedź 5 września 2016 przez MichuDev Pasjonat (20,300 p.)
  • Nigdzie nie ma delete, ani funkcji zwalniającej pamięć z języka C.
  • Nie korzystasz dobrze ze wskaźników, ponieważ nie musisz do każdej zmiennej przypisywać wskaźnika, oraz w twoim programie nie widzę sensu użycia wskaźników.
  • Jeśli chcesz ocenę kodu, masz pytania ?
  • Pisz w komentarzach pod tą odpowiedzią. Chętnie odpowiem ;)
komentarz 5 września 2016 przez MichuDev Pasjonat (20,300 p.)
Wszystko co jest w pamięci ma jakiś adres, jak go znasz to możesz się tam odwołać (adres jest przypisywany w czasie kompilacji).

Jeśli będziesz bardziej zaawansowany zrozumiesz, że jeśli piszesz program (nie system), to ten adres nie będzie normalnym adresem (system stosuje stronnicowanie i tłumaczy twoje adresy, na adresy wewnątrz strony).
komentarz 5 września 2016 przez hubercik Użytkownik (560 p.)

Czy ten kod jest teraz poprawny? Czy dla zmiennej "wybierz" trzeba tworzyć nowy wskaźnik? Jeśli nie to skąd program wie, którą wartość wywołać? --> mam na myśli to , że do *e są przypisane 2 zmienne, a gdy przypisze jeszcze adres zmiennej "wybierz" to tworzy się coś takiego : *w= adres_x, adres_y, adres_wybierz -- > skąd wskaźnik wie, by wywołać wartość wybierz? Już sam nie wiem... Chyba źle sobie wyobrażam jak to wygląda...

Ps. Przypisałem 3 zmienne do *e i działało ... /: switch wyrzucał wartość poprawną

kod:



#include <iostream>
using namespace std;

int main()
{
    for(;;)
    {
    int x,y;
        int *e;
    cout<<"Podaj pierwszą liczbę: ";
    cin>>x;
    e=&x;
    cout<<"Podaj drugą liczbę: ";
    cin>>y;
    e=&y;
        
    cout<<"Main menu:"<<endl;
    cout<<"1.Dodawanie"<<endl;
    cout<<"2.Odejmowanie"<<endl;
    cout<<"3.Mnożenie"<<endl;
    cout<<"4.Dzielenie"<<endl;
    cout<<"5.Wyjście"<<endl;
    cout<<"wybierz: ";
    int wybierz, *w;
    cin>>wybierz;
    w=&wybierz;
    switch(*w)
    {
        case 1: cout<<"Suma="<<x+y<<endl;    break;
        case 2: cout<<"Różnica="<<x-y<<endl; break;
        case 3: cout<<"Iloczyn="<<x*y<<endl;  break;
        case 4: cout<<"Iloraz="<<x/y<<endl;   break;
            
            
        case 5: exit(0);
        
        default: { cout<<"Nie ma takiej opcji w menu, jestem zmuszony do zamknięcia programu!"<<endl; exit(0); } break;
            
    }
        
    
    }
   
    
    return 0;
}






 

komentarz 5 września 2016 przez MichuDev Pasjonat (20,300 p.)
To jest ten sam kod, ale mógłbyś zmienić bloczek z kodem na C++ (masz actionscript). Czytaj prywatne wiadomości.
komentarz 5 września 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Nie można do jednego wskaźnika przypisać kilka adresów na raz. Nie możesz też usunąć wskaźnika operatorem delete, ani w żadny inny sposób, chyba, że jest to nijako wskaźnik na wskaźnik.

Stosując operator delete usuwasz pamięć, którą za pomocą tego wskaźnika zaalokowałeś, jeśli tego nie robisz, tak jak w twoim przypadku, to nie masz czego usuwać. W twoim przypadku przypisujesz tym wskaźnikom adres zmiennych, które utworzyłeś statycznie, nie dynamicznie.

int * wskaznik;
wskaznik = new int;
*wskaznik = 7;
cout << "Wartosc pod wskaznikiem: " << *wskaznik;
delete wskaznik;

Powyzszy kod tworzy wskaznik na zmienna int. Potem dynamicznie alokuje pamięć na taego inta, przypisuje mu wartosc 7, wypisuje ją, a następnie zwalnia tą pamięć. Wkaznik jest statyczny, tak jak np. zmienne x,y w twoim programie, pozostaje wiec do konca jego dzialania i dopiero wtedy jest usuwany.

komentarz 5 września 2016 przez MichuDev Pasjonat (20,300 p.)
Jak pomogłem daj łapkę w górę / najlepsza odpowiedź. To motywuje do pomocy.
0 głosów
odpowiedź 5 września 2016 przez hubercik Użytkownik (560 p.)
Temat jest do zamknięcia dziękuje wszystkim za odpowiedzi , miłego wieczoru życzę! :)

Podobne pytania

0 głosów
3 odpowiedzi 1,952 wizyt
pytanie zadane 5 września 2019 w C i C++ przez Vitall Początkujący (400 p.)
0 głosów
1 odpowiedź 160 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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!

...