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

Dynamiczne alokowanie pamięci - pełne zrozumienie

Object Storage Arubacloud
0 głosów
2,998 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez MatMarci Początkujący (260 p.)

Witam, 

Wydaję mi się, iż zrozumiałem i rozkminiłem dynamiczne alokowanie pamięci.

Proszę o weryfikację mojej dumy. Z góry dziękuję!

#include <iostream>
#include <iomanip>

using namespace std;

int ile;

int main()
{
    cout << "Ile liczb w tablicy: " << endl;
    cin>>ile;

    int *tablica;                                 //mówię iż zaraz będę rezerwował nowy obszar o konkretnych wymiarach
    tablica=new int [ile];                 //rezerwuję nowy obszar o wymiarach 'ile'
    int *a;                                          //tworze zmienną pomocniczą 'a', tylko dla możliwości odczytu adresu w pamięci komórek

    for(int i=0; i<ile; i++)                //pętla powtarzana 'ile' razy
    {
        cin>>tablica[i];                      //wczytanie wartości z klawiatury do poszczególnych elementów tablicy
        cout<<endl;

        a=&tablica[i];                         //przypisanie zmiennej pomocniczej 'a' adresu w pamięci poszczególnych elementów tablicy
        cout<<a <<endl;                   //pokazanie wartości adresu poszczególnych komórek  16-kowo
        cout<< (int)a <<endl;           //pokazanie wartości adresu poszczególnych komórek zamienione z 16-kowego na 10-tne
        cout<<*a <<endl;                 //pokazanie wartości, która znajduję się pod konkretnym adresem
    }

    delete [] tablica;

    return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 22 marca 2017 przez Piter10p Bywalec (2,750 p.)
Te komentarze nie są potrzebne. Tylko drażnią i skupiają na sobie wzrok nie wnosząc nic konstruktywnego.

"//pętla powtarzana 'ile' razy" Przecież widzę.

Wybacz za krytykę. Ale te komentarze są zbędne. Naprawdę.

Kod zadziała, owszem. Wygląda też całkiem ładnie choć ten wskaźnik a jest zbędny. Dużo ciekawiej by było jakbyś uczył się bezpośrednio operować na tablicy :)

Inną drogą... W rzeczywistości dynamiczna alokacja przyda ci się tak naprawdę dopiero w podejściu obiektowym i większych projektach.

Pozdrawiam
komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)
Dzięki za odpowiedz.

Masz rację, z tym opisem pętli for to przesadziłem. A pozostałem komentarze pozwalały mi zrozumieć istotę podejścia.

Napisałem o tym natomiast ponieważ rozwiązywałem zadanie na SPOJ-u i trzeba było użyć dynamicznej tablicy i ni hu hu mi nie szło.

Pozdrawiam!
komentarz 22 marca 2017 przez unknown Nałogowiec (39,560 p.)

W rzeczywistości dynamiczna alokacja przyda ci się tak naprawdę dopiero w podejściu obiektowym i większych projektach.

 W rzeczywistości nie używa się new/delete

komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)
Rozumiem, że mówisz o innym bardziej zaawansowanym sposobie zapisu dynamicznej alokacji?
komentarz 24 marca 2017 przez Piter10p Bywalec (2,750 p.)
Osobiście kilka razy zdarzyło mi się ich użyć. Szczególnie jak przesiadałem się z powrotem z c# na c++ ;)
+1 głos
odpowiedź 22 marca 2017 przez Knayder Nałogowiec (37,640 p.)
a = &tablica[i];  //Przekombinowane

a = tablica + i; //Lepiej i ładniej tak

 

komentarz 22 marca 2017 przez MatMarci Początkujący (260 p.)

Rozumiem, że :

a = tablica + i;

wystarczy, ponieważ w tym przypadku samo 'tablica' odwołuję się domyślnie do miejsca w pamięci 0 komórki całej dynamicznej tablicy?

Ja użyłem '&', żeby właśnie dla potrzeb przykładu odwołać się najpierw do miejsca w pamięci, a później do wartości z tego miejsca w pamięci.

Pozdrawiam!

1
komentarz 22 marca 2017 przez Knayder Nałogowiec (37,640 p.)
Tak, samo tablica to wskaźnik na pierwszy element tablicy. Dodawanie liczby o wartości 'n' zwróci nam wskaźnik na n-ty element.
1
komentarz 22 marca 2017 przez Antero00 Gaduła (3,670 p.)
Zapamiętaj, że " Nazwa tablicy jest równocześnie adresem jej zerowego elementu " :)
komentarz 22 marca 2017 przez unknown Nałogowiec (39,560 p.)

Nazwa tablicy jest równocześnie adresem jej zerowego elementu 

 Nie jest. Nazwa tablicy to nazwa tablicy. W niektórych przypadkach zachodzi niejawna konwersja na wskaźnik na 1 element tablicy.

komentarz 25 marca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
Podasz jakis dowod/przyklad?
komentarz 25 marca 2017 przez unknown Nałogowiec (39,560 p.)

C++17 §4.2/1

An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion (4.4) is applied. The result is a pointer to the first element of the array.

0 głosów
odpowiedź 25 marca 2017 przez MatMarci Początkujący (260 p.)

Już sporo mi pomogliści i uświadomiliście, iż nie jedno rozwiązanie jest prawidłowe, nie mówiąc o tym, że można zapisywać wiele rzeczy bardziej klarownie. 

A co sądzicie o mojej deklaracji tablicy 2 wymiarowej? 

Ocenicie moje rozwiązanie?

#include <iostream>

using namespace std;

int w=2,k; // k - ilosc partii, w - liczba graczy, w tyl przypadku 2
int r1;

int main()
{
    cin>>k;

    //stworz i wypełnij
    int **tab_zet;
    tab_zet = new int *[k];
    for (int i=0; i<k; i++)
    {
        tab_zet [i] = new int [w];
        for (int j=0; j<w; j++)
        {
            cin>>tab_zet[i][j];
        }
    }

    //wypisz
    for (int z=0; z<k;z++, cout<<endl)
    {
        for (int y=0; y<w; y++)
        {
            cout<<tab_zet[z][y];
        }
    }

    //zniszcz tab2
    for ( int i(0); i < k; ++i )
    delete [] tab_zet[i];
    delete [] tab_zet; 
    tab_zet = NULL;

    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,537 wizyt
0 głosów
2 odpowiedzi 427 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)
0 głosów
1 odpowiedź 262 wizyt

92,541 zapytań

141,383 odpowiedzi

319,482 komentarzy

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

...