Jak zadeklarować tablicę 2D przy użyciu nowego?
Na przykład dla „normalnej” tablicy:
int* ary = new int[Size]
ale
int** ary = new int[sizeY][sizeX]
a) nie działa / nie kompiluje się i b) nie osiąga tego, co:
int ary[sizeY][sizeX]
robi.
c++
arrays
multidimensional-array
dynamic-allocation
użytkownik20844
źródło
źródło
Odpowiedzi:
Dynamiczna tablica 2D jest w zasadzie tablicą wskaźników do tablic . Możesz go zainicjować za pomocą pętli, takiej jak ta:
Powyższe, dla
colCount= 5
irowCount = 4
, spowodowałoby:źródło
new
jest tworzone na stercie i należy je przydzielićdelete
, pamiętaj o tym i pamiętaj o usunięciu tej pamięci ze stosu, gdy skończysz, aby zapobiec wyciekom.T (*ptr)[M] = new T[N][M];
jest poprawnym rozwiązaniem… Żadna liczba tablic wskaźników nigdy nie będzie taka sama jak tablica tablic…Powinien być:
a potem sprzątanie byłoby:
EDYCJA: jak zauważył Dietrich Epp w komentarzach, nie jest to do końca lekkie rozwiązanie. Alternatywnym podejściem byłoby użycie jednego dużego bloku pamięci:
źródło
i*sizeX+j
? Jeśli dobrze pamiętam, przy porządkowaniu dużych wierszy powinien to być wiersz * numColumns + col.Chociaż ta popularna odpowiedź da pożądaną składnię indeksowania, jest podwójnie nieefektywna: duża i wolna zarówno w czasie, jak i przestrzeni. Jest lepszy sposób.
Dlaczego ta odpowiedź jest duża i powolna
Proponowanym rozwiązaniem jest utworzenie dynamicznej tablicy wskaźników, a następnie zainicjowanie każdego wskaźnika do jego własnej, niezależnej tablicy dynamicznej. Zaletą tego podejścia jest to, że daje składni indeksowania jesteś przyzwyczajony do, więc jeśli chcesz znaleźć wartość matrycy w pozycji X, Y, można powiedzieć:
Działa to, ponieważ macierz [x] zwraca wskaźnik do tablicy, która jest następnie indeksowana za pomocą [y]. Podział:
Wygodne, tak? Podoba nam się nasza składnia [x] [y].
Ale rozwiązanie ma dużą wadę , ponieważ jest zarówno tłuste, jak i powolne.
Dlaczego?
Powód, dla którego jest zarówno gruby, jak i powolny, jest w rzeczywistości taki sam. Każdy „wiersz” w macierzy to osobno przydzielona tablica dynamiczna. Dokonanie przydziału sterty jest drogie zarówno pod względem czasu, jak i przestrzeni. Alokator potrzebuje czasu na dokonanie alokacji, czasami uruchamiając w tym celu algorytmy O (n). A alokator „wypełnia” każdą tablicę wierszy dodatkowymi bajtami do księgowości i wyrównywania. Ta dodatkowa przestrzeń kosztuje ... cóż ... dodatkowa przestrzeń. Zwalnianie przydziału zajmie również więcej czasu, gdy przejdziesz do zwalniania macierzy, starannie uwalniając każdy przydział wiersza. Sprawia, że się pocę, gdy o tym myślę.
Jest jeszcze jeden powód, dla którego jest wolny. Te oddzielne przydziały mają tendencję do życia w nieciągłych częściach pamięci. Jeden wiersz może być pod adresem 1000, drugi pod adresem 100 000 - masz pomysł. Oznacza to, że gdy przemierzasz matrycę, przeskakujesz przez pamięć jak dzika osoba. Powoduje to często brak pamięci podręcznej, co znacznie spowalnia czas przetwarzania.
Jeśli więc absolutnie musisz mieć swoją uroczą składnię indeksowania [x] [y], skorzystaj z tego rozwiązania. Jeśli chcesz szybkości i małości (a jeśli nie przejmujesz się nimi, dlaczego pracujesz w C ++?), Potrzebujesz innego rozwiązania.
Inne rozwiązanie
Lepszym rozwiązaniem jest przydzielenie całej macierzy jako pojedynczej tablicy dynamicznej, a następnie użycie (nieco) sprytnej matematyki indeksowania w celu uzyskania dostępu do komórek. Matematyka indeksowania jest tylko bardzo sprytna; nie, to wcale nie jest sprytne: to oczywiste.
Biorąc pod uwagę tę
index()
funkcję (która, jak sądzę, należy do klasy, ponieważ musi znaćm_width
macierz), można uzyskać dostęp do komórek w macierzy macierzy. Tablica macierzy jest przydzielana w następujący sposób:Odpowiednik tego w wolnym, tłustym roztworze:
... czy jest to szybkie, małe rozwiązanie:
Smutne wiem Ale przyzwyczaisz się do tego. A twój procesor ci podziękuje.
źródło
class Matrix { int* array; int m_width; public: Matrix( int w, int h ) : m_width( w ), array( new int[ w * h ] ) {} ~Matrix() { delete[] array; } int at( int x, int y ) const { return array[ index( x, y ) ]; } protected: int index( int x, int y ) const { return x + m_width * y; } };
jeśli wyprostujesz ten kod, może to mieć sens i rzucić światło na powyższą odpowiedź.#define ROW_COL_TO_INDEX(row, col, num_cols) (row*num_cols + col)
Następnie możesz użyć go, ponieważint COLS = 4; A[ ROW_COL_TO_INDEX(r, c, COLS) ] = 75;
narzut naprawdę wpływa na to, kiedy wykonujemy multiplikacje macierzy o złożoności O (n ^ 3) lub O (n ^ 2.81) dla algorytmu Strassena .a[x][y]
, co faktycznie robisz, to*(*(a + x) + y)
: dwa dodatki i dwa pobrania pamięci. Za pomocąa[index(x, y)]
tego, co faktycznie robisz, są*(a + x + w*y)
: dwa dodatki, jedno pomnożenie i jedno pobranie pamięci. To drugie jest często preferowane, z powodów ujawnionych w tej odpowiedzi (tj. Warto wymienić dodatkowe pobieranie pamięci z pomnożeniem, szczególnie dlatego, że dane nie są pofragmentowane, a zatem nie brakuje pamięci podręcznej).W C ++ 11 jest możliwe:
W ten sposób pamięć nie jest inicjowana. Aby zainicjować, zrób to zamiast tego:
Przykładowy program (skompiluj z „g ++ -std = c ++ 11”):
Wynik:
źródło
using arr2d = double(*)[2]; arr2d array = new double[M][N];
double (*)[M][N]
albodouble(*)[][N]
M, gdzie N jest stałymi wyrażeniami.Zakładam, że na podstawie Twojego statycznego przykładu macierzy potrzebujesz tablicy prostokątnej, a nie poszarpanej. Możesz użyć następujących opcji:
Następnie możesz uzyskać dostęp do elementów jako:
Nie zapomnij użyć delete [] na
ary
.źródło
Istnieją dwie ogólne techniki, które poleciłbym do tego w C ++ 11 i wyższych, jedna dla wymiarów czasu kompilacji i jedna dla czasu wykonywania. Obie odpowiedzi zakładają, że potrzebujesz jednolitych, dwuwymiarowych tablic (nie poszarpanych).
Wymiary czasu kompilacji
Użyj
std::array
ofstd::array
a następnie użyćnew
, aby umieścić go na stercie:Ponownie działa to tylko wtedy, gdy rozmiary wymiarów są znane w czasie kompilacji.
Wymiary czasu pracy
Najlepszym sposobem na uzyskanie 2-wymiarowej tablicy o rozmiarach znanych tylko w czasie wykonywania jest zawinięcie jej w klasę. Klasa przydzieli tablicę 1d, a następnie przeładuje,
operator []
aby zapewnić indeksowanie dla pierwszego wymiaru. Działa to, ponieważ w C ++ tablica 2D jest rzędem głównym:(Źródło: http://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays/ )
Ciągła sekwencja pamięci jest dobra ze względu na wydajność, a także łatwa do czyszczenia. Oto przykładowa klasa, która pomija wiele przydatnych metod, ale pokazuje podstawową ideę:
Tworzymy więc tablicę z
std::make_unique<int[]>(rows * columns)
wpisami. Przeciążamy,operator []
co zindeksuje dla nas wiersz. Zwraca,int *
który wskazuje na początek wiersza, który można następnie wyrejestrować jak zwykle dla kolumny. Zauważ, żemake_unique
najpierw jest dostarczany w C ++ 14, ale w razie potrzeby możesz go uzupełnić w C ++ 11.Często zdarza się również, że tego typu struktury również się przeciążają
operator()
:Technicznie nie użyłem
new
tutaj, ale to jest trywialne, aby przejść odstd::unique_ptr<int[]>
doint *
i wykorzystanienew
/delete
.źródło
std::array
odstd::array
s:std::array<std::array<int, columns> rows>
.asserts
do debugowania kompilacji w celu weryfikacji dostępu do pamięci itp. Te dodatki ogólnie ułatwiają i uprzyjemniają pracę.make_unique
zamiastnew/delete
.To pytanie mnie wkurzyło - to dość powszechny problem, że dobre rozwiązanie powinno już istnieć, coś lepszego niż wektor wektorów lub tworzenie własnych indeksów tablic.
Kiedy coś powinno istnieć w C ++, ale nie istnieje, pierwszym miejscem do poszukiwania jest boost.org . Nie znalazłem doładowania tablicy wielowymiarowej Biblioteka
multi_array
. Zawiera nawetmulti_array_ref
klasę, której można użyć do zawinięcia własnego jednowymiarowego bufora macierzy.źródło
auto
słowo kluczowe. Dziwi mnie, że nie próbowali radzić sobie z tablicami 2D, zwłaszcza że Boost już wskazał drogę.Dlaczego nie użyć STL: wektor? To takie proste i nie musisz usuwać wektora.
Możesz także zainicjować „tablice”, po prostu nadaj mu wartość domyślną
Źródło: Jak utworzyć 2, 3 (lub wiele) tablic wymiarowych w C / C ++?
źródło
Tablica 2D jest w zasadzie tablicą wskaźników 1D, przy czym każdy wskaźnik wskazuje na tablicę 1D, która przechowuje rzeczywiste dane.
Tutaj N to wiersz, a M to kolumna.
alokacja dynamiczna
napełnić
wydrukować
wolny
źródło
Jak przydzielić ciągłą tablicę wielowymiarową w GNU C ++? Istnieje rozszerzenie GNU, które pozwala na działanie „standardowej” składni.
Wygląda na to, że problem pochodzi od nowego operatora []. Upewnij się, że zamiast tego używasz operatora new:
I to wszystko: otrzymujesz wielowymiarową tablicę kompatybilną z C ...
źródło
double (*in)[m][n] = (double (*)[m][n])new double[k*m*n];
też nie działa. Otrzymuję błędy C2057, C2540,n
ponieważ nie jest to znane w czasie kompilacji. Nie rozumiem, dlaczego nie mogę tego zrobić, ponieważ pamięć jest przydzielona poprawnie i są to tylko wskaźniki ułatwiające obsługę tej pamięci. (VS 2010)gcc
oszukał mnie, kiedy to napisałem: podawanie-std=c++11
nie jest wystarczające, aby włączyć ścisłą standardową zgodność,-pedantic-errors
jest również wymagane. Bez późniejszej flagi zgcc
radością przyjmuje obsadę, nawet jeśli nie jest to zgodne ze standardem C ++. Z tego, co wiem teraz, mogę doradzić, aby wrócić do C tylko podczas robienia rzeczy, które są wysoce zależne od tablic wielowymiarowych. C99 jest pod tym względem znacznie potężniejszy niż nawet C ++ 17.typedef jest twoim przyjacielem
Po powrocie i spojrzeniu na wiele innych odpowiedzi stwierdziłem, że głębsze wyjaśnienie jest właściwe, ponieważ wiele innych odpowiedzi cierpi z powodu problemów z wydajnością lub zmusza cię do użycia nietypowej lub uciążliwej składni do zadeklarowania tablicy lub uzyskania dostępu do tablicy elementy (lub wszystkie powyższe).
Po pierwsze, ta odpowiedź zakłada, że znasz wymiary tablicy w czasie kompilacji. Jeśli to zrobisz, jest to najlepsze rozwiązanie, ponieważ zapewni zarówno najlepszą wydajność, jak i pozwoli na użycie standardowej składni tablicy w celu uzyskania dostępu do elementów tablicy .
Daje to najlepszą wydajność, ponieważ alokuje wszystkie tablice jako ciągły blok pamięci, co oznacza, że prawdopodobnie będziesz mieć mniej braków stron i lepszą lokalizację przestrzenną. Alokacja w pętli może spowodować, że poszczególne tablice zostaną rozproszone na wielu nieciągłych stronach w przestrzeni pamięci wirtualnej, ponieważ pętla alokacji może zostać przerwana (być może wiele razy) przez inne wątki lub procesy lub po prostu ze względu na dyskrecję alokator wypełniający małe, puste bloki pamięci, które akurat są dostępne.
Inne zalety to prosta składnia deklaracji i standardowa składnia dostępu do tablicy.
W C ++ przy użyciu nowego:
Lub styl C za pomocą calloc:
źródło
Ten problem niepokoi mnie od 15 lat, a wszystkie dostarczone rozwiązania nie były dla mnie satysfakcjonujące. Jak w sposób ciągły tworzyć dynamiczną tablicę wielowymiarową w pamięci? Dzisiaj w końcu znalazłem odpowiedź. Korzystając z następującego kodu, możesz to zrobić:
Po wywołaniu programu o wartości sizeX = 20 i sizeY = 15, wynik będzie następujący:
Jak widać, tablica wielowymiarowa leży w pamięci w sposób ciągły, a żadne dwa adresy nie nakładają się na siebie. Nawet procedura zwalniania tablicy jest prostsza niż standardowy sposób dynamicznego przydzielania pamięci dla każdej pojedynczej kolumny (lub wiersza, w zależności od sposobu wyświetlania tablicy). Ponieważ tablica zasadniczo składa się z dwóch tablic liniowych, tylko te dwa muszą zostać (i mogą być) uwolnione.
Metodę tę można rozszerzyć o więcej niż dwa wymiary przy użyciu tej samej koncepcji. Nie zrobię tego tutaj, ale kiedy wpadniesz na pomysł, jest to proste zadanie.
Mam nadzieję, że ten kod pomoże ci tak bardzo, jak pomógł mi.
źródło
array2d[i] = buffer + i * sizeX
. Pomaga to w niewielkim stopniu, ale w kodzie używającym tablicy, kompilator nie może po prostu zwiększać wskaźników do skanowania tablicy.make_unique<int[]>(sizeX*sizeY)
do skonfigurowania ciągłej pamięci imake_unique<int*[]>(sizeX)
do skonfigurowania pamięci dla wskaźników (które powinny być przypisane w ten sam sposób, jak pokazano). Dzięki temu nie musisz dzwonićdelete[]
dwa razy na końcu.temp
? Biorąc pod uwagę zalety (tablica Continuos 2d z nieznanymi wymiarami w czasie kompilacji), nie jestem pewien, czy obchodzi mnie to. Nie zrozumiałem, co oznacza @PeterCordesextra layer of indirection
, co to jest? Dlaczego nawiasarray2d[i] = (temp + i * sizeX)
;Celem tej odpowiedzi nie jest dodanie niczego nowego, czego inni jeszcze nie opisują, ale rozszerzenie odpowiedzi @Kevin Loney.
Możesz użyć lekkiej deklaracji:
i składnia dostępu będzie:
ale dla większości jest to uciążliwe i może prowadzić do zamieszania. Możesz więc zdefiniować makro w następujący sposób:
Teraz możesz uzyskać dostęp do tablicy przy użyciu bardzo podobnej składni
ary(i, j) // means ary[i][j]
. Ma to tę zaletę, że jest proste i piękne, a jednocześnie używanie wyrażeń zamiast indeksów jest również prostsze i mniej mylące.Aby uzyskać dostęp, powiedzmy, ary [2 + 5] [3 + 8], możesz pisać
ary(2+5, 3+8)
zamiast o złożonym wyglądzie,ary[(2+5)*SizeY + (3+8)]
tzn. Zapisuje nawiasy i poprawia czytelność.Ostrzeżenia:
SizeY
należy ją przekazać o tej samej nazwie (lub zamiast tego zadeklarować jako zmienną globalną).Lub, jeśli chcesz użyć tablicy w wielu funkcjach, możesz dodać SizeY również jako inny parametr w definicji makra, taki jak:
Masz pomysł. Oczywiście staje się to zbyt długie, aby było użyteczne, ale wciąż może zapobiec pomyleniu + i *.
Zdecydowanie nie jest to zalecane i przez większość doświadczonych użytkowników zostanie potępione jako zła praktyka, ale nie mogłem się powstrzymać przed udostępnieniem go z powodu jego elegancji.
Edycja:
jeśli potrzebujesz przenośnego rozwiązania, które działa na dowolnej liczbie tablic, możesz użyć tej składni:
a następnie możesz przekazać dowolną tablicę do wywołania, o dowolnym rozmiarze, używając składni dostępu:
PS: Testowałem je i ta sama składnia działa (zarówno jako wartość jak i wartość) na kompilatorach g ++ 14 i g ++ 11.
źródło
Spróbuj to zrobić:
źródło
Tutaj mam dwie opcje. Pierwszy pokazuje pojęcie tablicy tablic lub wskaźnika wskaźników. Wolę drugi, ponieważ adresy są ciągłe, jak widać na obrazku.
źródło
Jeśli Twój projekt to CLI (obsługa języka wspólnego języka) , to:
Możesz użyć klasy tablicy, a nie tej, którą otrzymujesz, pisząc:
Innymi słowy, nie niezarządzana klasa tablicowa, którą otrzymujesz podczas korzystania ze standardowej przestrzeni nazw i gdy dołączasz nagłówek tablicy, nie niezarządzana klasa tablicowa zdefiniowana w standardowej przestrzeni nazw i nagłówku tablicy, ale tablica klas zarządzanych interfejsu CLI.
z tą klasą możesz stworzyć tablicę o dowolnej randze .
Poniższy kod tworzy nową dwuwymiarową tablicę 2 wierszy i 3 kolumn oraz typu int, a ja nazywam ją „arr”:
Teraz możesz uzyskać dostęp do elementów tablicy, nadając jej nazwę i pisząc tylko jeden nawias kwadratowy
[]
, a wewnątrz nich dodaj wiersz i kolumnę i oddziel je przecinkiem,
.Poniższy kod poniżej umożliwia dostęp do elementu w drugim wierszu i pierwszej kolumnie tablicy, którą już utworzyłem w poprzednim kodzie powyżej:
pisanie tylko tego wiersza ma na celu odczytanie wartości w tej komórce, tj. uzyskanie wartości w tej komórce, ale jeśli dodasz
=
znak równości , masz zamiar zapisać wartość w tej komórce, tj. ustawić wartość w tej komórce. Oczywiście możesz również używać operatorów + =, - =, * = i / =, tylko dla liczb (int, float, double, __int16, __int32, __int64 itp.), Ale na pewno już to znasz.Jeśli twój projekt nie jest CLI, możesz użyć niezarządzanej klasy tablicowej przestrzeni nazw std, jeśli
#include <array>
oczywiście, ale problem polega na tym, że ta klasa tablic jest inna niż tablica CLI. Utwórz tablicę tego typu jest taka sama jak CLI, tyle że będziesz musiał usunąć^
znak igcnew
słowo kluczowe. Ale niestety drugi parametr int w<>
nawiasach określa długość (tj. Rozmiar) tablicy, a nie jej pozycję!Nie ma sposobu na określenie rangi w tego rodzaju tablicach, ranga jest tylko cechą tablicy CLI . .
tablica std zachowuje się jak normalna tablica w c ++, którą definiuje się na przykład za pomocą wskaźnika,
int*
a następnie:new int[size]
lub bez wskaźnika:,int arr[size]
ale w przeciwieństwie do normalnej tablicy c ++, tablica std zapewnia funkcje, których można używać z elementami tablicy, jak wypełnienie, początek, koniec, rozmiar itp., ale normalna tablica nic nie daje .Ale wciąż tablica standardowa jest tablicą jednowymiarową, podobnie jak normalne tablice c ++. Ale dzięki rozwiązaniom, które inni faceci sugerują, w jaki sposób można zrobić normalną jednowymiarową tablicę c ++ do dwuwymiarowej, możemy dostosować te same pomysły do standardowej tablicy, np. Zgodnie z pomysłem Mehrdada Afshari możemy napisać następujący kod:
Ten wiersz kodu tworzy „tablicę połączoną” , która jest jednowymiarową tablicą, którą każda z jej komórek jest lub wskazuje inną tablicę jednowymiarową.
Jeśli wszystkie tablice jednowymiarowe w tablicy jednowymiarowej mają taką samą długość / rozmiar, możesz traktować zmienną array2d jako prawdziwą tablicę dwuwymiarową, a ponadto możesz użyć specjalnych metod do traktowania wierszy lub kolumn, w zależności od tego, jak ją widzisz mając na uwadze, że w tablicy 2D obsługiwana jest ta tablica standardowa.
Możesz także skorzystać z rozwiązania Kevina Loneya:
ale jeśli używasz standardowej tablicy, kod musi wyglądać inaczej:
I nadal mają unikalne funkcje standardowej tablicy.
Zauważ, że nadal możesz uzyskać dostęp do elementów tablicy standardu za pomocą
[]
nawiasów i nie musisz wywoływaćat
funkcji. Możesz także zdefiniować i przypisać nową zmienną int, która będzie obliczać i utrzymywać całkowitą liczbę elementów w tablicy std, i używać jej wartości zamiast powtarzaniasizeX*sizeY
Możesz zdefiniować swoją własną klasę ogólną dwuwymiarowej tablicy i zdefiniować konstruktora dwuwymiarowej klasy macierzy, aby otrzymać dwie liczby całkowite w celu określenia liczby wierszy i kolumn w nowej tablicy dwuwymiarowej oraz zdefiniować funkcję get, która odbiera dwa parametry liczby całkowitej które uzyskują dostęp do elementu w tablicy dwuwymiarowej i zwracają jego wartość oraz ustawiają funkcję, która otrzymuje trzy parametry, że dwie pierwsze są liczbami całkowitymi określającymi wiersz i kolumnę w tablicy dwuwymiarowej, a trzeci parametr jest nową wartością element. Jego typ zależy od typu wybranego w klasie ogólnej.
Będziesz w stanie zaimplementować to wszystko, używając albo normalnej tablicy c ++ (wskaźniki lub bez), albo standardowej tablicy i użyj jednego z pomysłów sugerowanych przez innych ludzi, dzięki czemu korzystanie z niej będzie łatwiejsze, jak tablicy cli lub dwóch tablica wymiarowa, którą można zdefiniować, przypisać i używać w języku C #.
źródło
Zacznij od zdefiniowania tablicy za pomocą wskaźników (wiersz 1):
źródło
Poniższy przykład może pomóc,
źródło
Jeśli chcesz tablicy 2d liczb całkowitych, które elementy są przydzielane sekwencyjnie w pamięci, musisz ją zadeklarować podobnie
gdzie zamiast x można wpisać dowolny wymiar, ale n musi być takie samo w dwóch miejscach. Przykład
musi wydrukować 6.
źródło
W niektórych przypadkach pozostawiłem ci rozwiązanie, które najlepiej dla mnie działa. Zwłaszcza jeśli ktoś zna [rozmiar?] Jeden wymiar tablicy. Bardzo przydatne dla tablicy znaków, na przykład, jeśli potrzebujemy tablicy o różnej wielkości tablic znaków [20].
Kluczem są nawiasy w deklaracji tablicowej.
źródło
Użyłem tego nie eleganckiego, ale systemu FAST, EASY i WORKING. Nie rozumiem, dlaczego nie może działać, ponieważ jedynym sposobem, aby system mógł utworzyć tablicę o dużych rozmiarach i uzyskać dostęp do części, nie tnie jej na części:
źródło
Nie wiem na pewno, czy nie podano następującej odpowiedzi, ale zdecydowałem się dodać jakieś lokalne optymalizacje do alokacji tablicy 2d (np. Macierz kwadratowa jest wykonywana tylko przez jedną alokację):
int** mat = new int*[n]; mat[0] = new int [n * n];
Jednak usunięcie przebiega w ten sposób ze względu na liniowość powyższego przydziału:
delete [] mat[0]; delete [] mat;
źródło
dynamiczne deklarowanie tablicy 2D:
Teraz w powyższym kodzie wzięliśmy podwójny wskaźnik i przypisaliśmy mu pamięć dynamiczną i podaliśmy wartość kolumn. Tutaj przydzielona pamięć jest tylko dla kolumn, teraz dla wierszy potrzebujemy tylko pętli for i przypisujemy wartość dla każdego wiersza pamięci dynamicznej. Teraz możemy używać wskaźnika tak, jak korzystamy z tablicy 2D. W powyższym przykładzie przypisaliśmy następnie losowe liczby do naszej tablicy 2D (wskaźnika). Wszystko dotyczy DMA tablicy 2D.
źródło
Używam tego podczas tworzenia dynamicznej tablicy. Jeśli masz klasę lub strukturę. I to działa. Przykład:
źródło