Przydział pamięci (wskaźnik na strukturę)
Ostatnio zmodyfikowano 2017-03-08 09:34
Anim Temat założony przez niniejszego użytkownika |
Przydział pamięci (wskaźnik na strukturę) » 2017-03-07 14:29:41 Mam problem ze zrozumieniem dynamicznego przydziału pamięci dla struktury. Chcę mieć strukturę taką jak w przykładzie poniżej: Czyli taką, która zawiera w sobie vector <int>. Jednak tutaj rodzi się moje pytanie: jak posłużyć się vectorem, aby można było używać wskaźnika na strukturę bezpiecznie. O ile poniższy kod działa (kompiluje się i nie wywala błędu), to kod nr 2 nie jest poprawny. Jak go poprawić, aby był poprawny? KOD I: #include <iostream> #include <cstdlib> #include <ctime> #include <vector>
using namespace std; struct dane { vector < int > tablica; };
bool funkcja( int rozmiar, dane * tab ) { if( tab == '\0' ) { tab = new dane; tab->tablica.push_back( 10 ); cout << tab->tablica[ 0 ] << endl; delete tab; return true; } else return false; }
int main() { int rozmiar = 10; dane * tab; cout << funkcja( rozmiar, tab ); return 0; }
KOD II (tutaj tylko funkcja()): bool funkcja( int rozmiar, dane * tab ) { if( tab == '\0' ) { tab = new dane; for( int a = 0; a < 10, a++ ) { tab->tablica.push_back( 10 ); } delete tab; return true; } else return false; }
Jak "pokazać" wskaźnikowi, że zajmiemy jakiś obszar pamięci ze względu na dynamiczny vector? Mam nadzieję, że wyrażam się w miarę jasno o co mi chodzi. Z góry dziękuję za podpowiedzi. |
|
Monika90 |
» 2017-03-07 17:11:35 Przyjęło się zapisywać to w taki sposób: ponieważ tab to jest wskaźnik. Jaki sens ma porównywanie wskaźnika ze znakiem? A to jest niezainicjalizowana zmienna, należy zainicjalizować: |
|
mateczek |
» 2017-03-07 19:46:00 dane * tab; cout << funkcja( rozmiar, tab );
|
|
Anim Temat założony przez niniejszego użytkownika |
» 2017-03-07 21:47:38 Dziękuję :) A w tym miejscu dodam dodatkowe pytanie: Czy nie lepiej zrobić to przez referencję (chyba nie rozumiem różnicy pomiędzy przekazywaniem przez wskaźnik i przez referencję)? W czym KOD 1 jest lepszy/gorszy/inny od KOD-u 2? : KOD 1: #include <iostream> #include <cstdlib> #include <ctime> #include <vector>
using namespace std; struct dane { vector < int > tablica; };
void funkcja( int rozmiar, dane * tab ) { for( int i = 0; i < rozmiar; i++ ) { tab->tablica.push_back( i + 1 ); cout << tab->tablica[ i ] << endl; } }
int main() { int rozmiar = 10; dane * tab = new dane; funkcja( rozmiar, tab ); delete tab; return 0; }
KOD 2: #include <iostream> #include <cstdlib> #include <ctime> #include <vector>
using namespace std; struct dane { vector < int > tablica; };
void funkcja( int rozmiar, dane & tab ) { for( int i = 0; i < rozmiar; i++ ) { tab.tablica.push_back( i + 1 ); cout << tab.tablica[ i ] << endl; } }
int main() { int rozmiar = 10; dane tab; funkcja( rozmiar, tab ); return 0; }
Mam nadzieję, że to nadal jest zgodne z punktem: jeden wątek - jeden temat ^^ |
|
carlosmay |
» 2017-03-08 09:34:28 Wskazniki nie mają "tego całego lukru składniowego", jaki mają referencje. Wskazniki zaś dają wieksze możliwości. Mając wskaźnik można zarządzać pamięcią ( ref nie), ale jeśli potrzebujesz odwołania się do obiektu bez kopiowania go, to referencja jest wygodniejsza (przejmuje cechy orginalnego obiektu). Jeśli chodzi o wydajność to nie ma różnicy. |
|
« 1 » |