Bagaimana cara mendeklarasikan array 2d menggunakan yang baru?
Seperti, untuk array "normal" saya akan:
int* ary = new int[Size]
tapi
int** ary = new int[sizeY][sizeX]
a) tidak berfungsi / dikompilasi dan b) tidak mencapai apa:
int ary[sizeY][sizeX]
tidak.
c++
arrays
multidimensional-array
dynamic-allocation
pengguna20844
sumber
sumber
Jawaban:
Array 2D dinamis pada dasarnya adalah array pointer ke array . Anda dapat menginisialisasi menggunakan loop, seperti ini:
Di atas, untuk
colCount= 5
danrowCount = 4
, akan menghasilkan yang berikut:sumber
new
dibuat pada heap dan harus de-dialokasikan dengandelete
, ingatlah ini dan pastikan untuk menghapus memori ini dari tumpukan ketika Anda sudah selesai dengan itu untuk mencegah kebocoran.T (*ptr)[M] = new T[N][M];
adalah solusi yang tepat ... Tidak ada jumlah array-of-pointer yang akan sama dengan array-of-array ...seharusnya:
dan kemudian membersihkannya adalah:
EDIT: seperti yang ditunjukkan Dietrich Epp dalam komentar ini bukan solusi yang ringan. Pendekatan alternatif adalah dengan menggunakan satu blok memori besar:
sumber
i*sizeX+j
? Jika saya ingat dengan benar, dengan pemesanan baris utama harus baris * numColumns + col.Meskipun jawaban populer ini akan memberikan Anda sintaks pengindeksan yang Anda inginkan, ini sangat tidak efisien: besar dan lambat dalam ruang dan waktu. Ada cara yang lebih baik.
Mengapa Jawaban Itu Besar dan Lambat
Solusi yang diusulkan adalah membuat array dinamis dari pointer, kemudian menginisialisasi setiap pointer ke array dinamisnya sendiri. The Keuntungan dari pendekatan ini adalah bahwa hal itu memberi Anda sintaks pengindeksan Anda terbiasa, jadi jika Anda ingin mencari nilai matriks pada posisi x, y, Anda mengatakan:
Ini berfungsi karena matriks [x] mengembalikan pointer ke array, yang kemudian diindeks dengan [y]. Hancurkan:
Nyaman ya Kami menyukai sintaks [x] [y] kami.
Tetapi solusinya memiliki kelemahan besar , yaitu bahwa ia gemuk dan lambat.
Mengapa?
Alasan mengapa keduanya gemuk dan lambat sebenarnya sama. Setiap "baris" dalam matriks adalah array dinamis yang dialokasikan secara terpisah. Membuat alokasi tumpukan mahal dalam waktu dan ruang. Pengalokasi membutuhkan waktu untuk membuat alokasi, terkadang menjalankan algoritma O (n) untuk melakukannya. Dan pengalokasi "bantalan" masing-masing array baris Anda dengan byte tambahan untuk pembukuan dan perataan. Biaya ruang ekstra itu ... well ... ruang ekstra. Deallocator juga akan membutuhkan waktu ekstra saat Anda melakukan deallocate matriks, dengan susah payah membebaskan setiap alokasi baris individu. Membuatku berkeringat hanya memikirkannya.
Ada alasan lain mengapa ini lambat. Alokasi yang terpisah ini cenderung hidup dalam bagian memori yang terputus-putus. Satu baris mungkin di alamat 1.000, yang lain di alamat 100.000 — Anda mendapatkan ide. Ini berarti bahwa ketika Anda melintasi matriks, Anda melompati memori seperti orang liar. Hal ini cenderung menyebabkan kesalahan cache yang sangat memperlambat waktu pemrosesan Anda.
Jadi, jika Anda mutlak harus memiliki sintaks pengindeksan [x] [y] imut Anda, gunakan solusi itu. Jika Anda ingin cepat dan kecil (dan jika Anda tidak peduli tentang itu, mengapa Anda bekerja di C ++?), Anda memerlukan solusi yang berbeda.
Solusi yang Berbeda
Solusi yang lebih baik adalah dengan mengalokasikan seluruh matriks Anda sebagai array dinamis tunggal, kemudian gunakan (sedikit) matematika pengindeksan Anda sendiri untuk mengakses sel. Matematika pengindeksan hanya sedikit sangat pintar; nah, sama sekali tidak pintar: sudah jelas.
Dengan
index()
fungsi ini (yang saya bayangkan adalah anggota kelas karena perlu mengetahuim_width
matriks Anda), Anda dapat mengakses sel dalam array matriks Anda. Array matriks dialokasikan seperti ini:Jadi, ini setara dengan solusi lambat dan gemuk:
... apakah ini dalam solusi cepat, kecil:
Sedih, saya tahu. Tetapi Anda akan terbiasa dengan hal itu. Dan CPU Anda akan berterima kasih.
sumber
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; } };
Jika Anda meluruskan kode itu mungkin masuk akal, dan mungkin menjelaskan jawaban di atas.#define ROW_COL_TO_INDEX(row, col, num_cols) (row*num_cols + col)
Kemudian Anda dapat menggunakannya sebagaiint COLS = 4; A[ ROW_COL_TO_INDEX(r, c, COLS) ] = 75;
overhead benar-benar mempengaruhi ketika kita melakukan perkalian matriks yang kompleksitas O (n ^ 3) atau O (n ^ 2.81) untuk algoritma Strassen .a[x][y]
, apa yang sebenarnya Anda lakukan adalah*(*(a + x) + y)
: dua tambahan dan dua pengambilan memori. Dengana[index(x, y)]
, apa yang sebenarnya Anda lakukan adalah*(a + x + w*y)
: dua tambahan, satu perkalian, dan satu pengambilan memori. Yang terakhir sering lebih disukai, karena alasan-alasan yang terungkap dalam jawaban ini (yaitu, perdagangan memori tambahan yang diambil dengan perkalian adalah sepadan, terutama karena data tidak terfragmentasi dan oleh karena itu Anda tidak ketinggalan cache).Dalam C ++ 11 dimungkinkan:
Dengan cara ini, memori tidak diinisialisasi. Untuk menginisialisasi, lakukan ini sebagai gantinya:
Program sampel (kompilasi dengan "g ++ -std = c ++ 11"):
Keluaran:
sumber
using arr2d = double(*)[2]; arr2d array = new double[M][N];
double (*)[M][N]
ataudouble(*)[][N]
dengan M, N menjadi ekspresi konstan.Saya kira dari contoh array statis Anda bahwa Anda ingin array persegi panjang, dan bukan yang bergerigi. Anda dapat menggunakan yang berikut ini:
Kemudian Anda dapat mengakses elemen sebagai:
Jangan lupa untuk menggunakan delete [] pada
ary
.sumber
Ada dua teknik umum yang saya sarankan untuk ini di C ++ 11 dan di atas, satu untuk kompilasi dimensi waktu dan satu untuk run time. Kedua jawaban mengasumsikan Anda menginginkan array dua dimensi yang seragam (bukan yang bergerigi).
Kompilasi dimensi waktu
Gunakan
std::array
daristd::array
dan kemudian menggunakannew
untuk meletakkannya di heap:Sekali lagi, ini hanya berfungsi jika ukuran dimensi diketahui pada waktu kompilasi.
Jalankan dimensi waktu
Cara terbaik untuk mencapai array 2 dimensi dengan ukuran yang hanya diketahui saat runtime adalah membungkusnya menjadi sebuah kelas. Kelas akan mengalokasikan array 1d dan kemudian membebani
operator []
untuk menyediakan pengindeksan untuk dimensi pertama. Ini berfungsi karena di C ++ array 2D adalah baris-utama:(Diambil dari http://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays/ )
Urutan memori yang berdekatan baik untuk alasan kinerja dan juga mudah dibersihkan. Berikut ini adalah contoh kelas yang menghilangkan banyak metode berguna tetapi menunjukkan ide dasarnya:
Jadi kami membuat array dengan
std::make_unique<int[]>(rows * columns)
entri. Kami membebanioperator []
yang akan mengindeks baris untuk kami. Ini mengembalikanint *
yang menunjuk ke awal baris, yang kemudian dapat dereferensi sebagai normal untuk kolom. Catat itumake_unique
pengiriman pertama dalam C ++ 14 tetapi Anda dapat polyfill dalam C ++ 11 jika perlu.Ini juga umum untuk tipe struktur ini untuk kelebihan beban
operator()
juga:Secara teknis saya belum pernah menggunakan di
new
sini, tapi sepele untuk pindah daristd::unique_ptr<int[]>
keint *
dan menggunakannew
/delete
.sumber
std::array
daristd::array
s:std::array<std::array<int, columns> rows>
.asserts
untuk debug membangun untuk memverifikasi akses memori, dll. Penambahan ini umumnya membuatnya lebih mudah dan lebih baik untuk bekerja dengan.make_unique
alih-alihnew/delete
.Pertanyaan ini mengganggu saya - itu adalah masalah yang cukup umum bahwa solusi yang baik seharusnya sudah ada, sesuatu yang lebih baik daripada vektor vektor atau menggulung pengindeksan array Anda sendiri.
Ketika sesuatu seharusnya ada di C ++ tetapi tidak, tempat pertama untuk melihatnya adalah boost.org . Di sana saya menemukan Boost Multidimensional Array Library
multi_array
,. Bahkan termasukmulti_array_ref
kelas yang dapat digunakan untuk membungkus buffer array satu dimensi Anda sendiri.sumber
auto
kata kunci. Saya terkejut mereka belum mencoba menangani array 2D, terutama karena Boost sudah menunjukkan caranya.Mengapa tidak menggunakan STL: vektor? Sangat mudah, dan Anda tidak perlu menghapus vektor.
Anda juga dapat menginisialisasi 'array', cukup berikan nilai default
Sumber: Cara Membuat 2, 3 (atau Multi) Dimensi Array dalam C / C ++?
sumber
Array 2D pada dasarnya adalah array pointer 1D, di mana setiap pointer menunjuk ke array 1D, yang akan menampung data aktual.
Di sini N adalah baris dan M adalah kolom.
alokasi dinamis
mengisi
mencetak
Gratis
sumber
Bagaimana cara mengalokasikan array multidimensi yang berdekatan di GNU C ++? Ada ekstensi GNU yang memungkinkan sintaks "standar" berfungsi.
Sepertinya masalahnya berasal dari operator baru []. Pastikan Anda menggunakan operator baru sebagai gantinya:
Dan itu saja: Anda mendapatkan array multidimensi C-kompatibel ...
sumber
double (*in)[m][n] = (double (*)[m][n])new double[k*m*n];
tidak berfungsi juga. Saya mendapatkan kesalahan C2057, C2540n
karena tidak diketahui pada waktu kompilasi. Saya tidak mengerti mengapa saya tidak bisa melakukannya, karena memori dialokasikan dengan benar dan itu hanya petunjuk untuk menangani memori ini dengan mudah. (VS 2010)gcc
membodohi saya ketika saya menulis ini: memasok-std=c++11
tidak cukup untuk mengaktifkan kesesuaian standar yang ketat,-pedantic-errors
diperlukan juga. Tanpa bendera yang lebih baru,gcc
dengan senang hati menerima para pemeran, meskipun itu memang tidak sesuai dengan standar C ++. Dengan apa yang saya ketahui sekarang, saya hanya bisa menyarankan untuk kembali ke C ketika melakukan hal-hal yang sangat bergantung pada array multidimensi. C99 jauh lebih kuat dalam hal ini daripada C ++ 17.typedef adalah teman Anda
Setelah kembali dan melihat banyak jawaban lain saya menemukan bahwa penjelasan yang lebih dalam adalah dalam urutan, karena banyak jawaban lain menderita masalah kinerja atau memaksa Anda untuk menggunakan sintaks yang tidak biasa atau memberatkan untuk mendeklarasikan array, atau mengakses array. elemen (atau semua yang di atas).
Pertama, jawaban ini mengasumsikan Anda mengetahui dimensi array pada waktu kompilasi. Jika Anda melakukannya, maka ini adalah solusi terbaik karena keduanya akan memberikan kinerja terbaik dan memungkinkan Anda untuk menggunakan sintaks array standar untuk mengakses elemen array. .
Alasan ini memberikan kinerja terbaik adalah karena mengalokasikan semua array sebagai blok memori yang berdekatan yang berarti bahwa Anda cenderung memiliki lebih sedikit halaman yang hilang dan lokalitas spasial yang lebih baik. Mengalokasikan dalam satu loop dapat menyebabkan array individu berakhir tersebar di beberapa halaman yang tidak bersebelahan melalui ruang memori virtual karena loop alokasi dapat terganggu (mungkin beberapa kali) oleh utas atau proses lain, atau hanya karena kebijaksanaan dari pengalokasi mengisi kecil, blok memori kosong itu kebetulan telah tersedia.
Manfaat lainnya adalah sintaks deklarasi sederhana dan sintaks akses array standar.
Di C ++ menggunakan yang baru:
Atau gaya C menggunakan calloc:
sumber
Masalah ini mengganggu saya selama 15 tahun, dan semua solusi yang diberikan tidak memuaskan bagi saya. Bagaimana Anda membuat array multidimensi dinamis secara bersamaan dalam memori? Hari ini saya akhirnya menemukan jawabannya. Dengan menggunakan kode berikut, Anda dapat melakukan hal itu:
Saat Anda menjalankan program dengan nilai sizeX = 20 dan sizeY = 15, hasilnya adalah sebagai berikut:
Seperti yang Anda lihat, array multidimensi terletak berdekatan dalam memori, dan tidak ada dua alamat memori yang tumpang tindih. Bahkan rutin untuk membebaskan array lebih sederhana daripada cara standar mengalokasikan memori secara dinamis untuk setiap kolom (atau baris, tergantung pada bagaimana Anda melihat array). Karena array pada dasarnya terdiri dari dua array linier, hanya keduanya yang harus (dan dapat) dibebaskan.
Metode ini dapat diperluas untuk lebih dari dua dimensi dengan konsep yang sama. Saya tidak akan melakukannya di sini, tetapi ketika Anda mendapatkan ide di baliknya, itu adalah tugas yang sederhana.
Saya harap kode ini akan membantu Anda sebanyak itu membantu saya.
sumber
array2d[i] = buffer + i * sizeX
. Jadi ini membantu sedikit, tetapi dalam kode menggunakan array, kompiler tidak bisa hanya menambah pointer untuk memindai array.make_unique<int[]>(sizeX*sizeY)
untuk mengatur penyimpanan yang berdekatan, danmake_unique<int*[]>(sizeX)
untuk mengatur penyimpanan untuk pointer (yang harus ditetapkan dengan cara yang sama seperti yang Anda tunjukkan). Ini membebaskan Anda dari persyaratan untuk menelepondelete[]
dua kali di akhir.temp
? Mempertimbangkan manfaat (array 2d berkelanjutan dengan dimensi yang tidak diketahui pada waktu kompilasi), saya tidak yakin saya peduli memilikinya menggantung. Saya tidak mengerti apa yang dimaksud dengan @PeterCordesextra layer of indirection
, apa itu? Mengapa kurung,array2d[i] = (temp + i * sizeX)
;Tujuan dari jawaban ini bukan untuk menambahkan sesuatu yang baru yang belum dibahas oleh orang lain, tetapi untuk memperluas jawaban @Kevin Loney.
Anda dapat menggunakan deklarasi ringan:
dan sintaks aksesnya adalah:
tetapi ini rumit untuk sebagian besar, dan dapat menyebabkan kebingungan. Jadi, Anda bisa mendefinisikan makro sebagai berikut:
Sekarang Anda dapat mengakses array menggunakan sintaks yang sangat mirip
ary(i, j) // means ary[i][j]
. Ini memiliki keuntungan karena sederhana dan indah, dan pada saat yang sama, menggunakan ekspresi sebagai pengganti indeks juga lebih sederhana dan kurang membingungkan.Untuk mengakses, katakanlah, [2 + 5] [3 + 8], Anda dapat menulis
ary(2+5, 3+8)
sebagai ganti dari yang tampak kompleksary[(2+5)*SizeY + (3+8)]
yaitu menghemat tanda kurung dan membantu keterbacaan.Peringatan:
SizeY
harus dilewatkan dengan nama yang sama (atau sebaliknya dinyatakan sebagai variabel global).Atau, jika Anda perlu menggunakan array dalam berbagai fungsi, maka Anda bisa menambahkan SizeY juga sebagai parameter lain dalam definisi makro seperti:
Anda mendapatkan idenya. Tentu saja, ini menjadi terlalu lama untuk berguna, tetapi masih dapat mencegah kebingungan dari + dan *.
Ini tidak direkomendasikan secara pasti, dan itu akan dikutuk sebagai praktik buruk oleh sebagian besar pengguna yang berpengalaman, tetapi saya tidak bisa menahan untuk membagikannya karena keanggunannya.
Sunting:
Jika Anda menginginkan solusi portabel yang berfungsi untuk sejumlah array, Anda dapat menggunakan sintaks ini:
dan kemudian Anda bisa meneruskan array apa pun ke panggilan, dengan ukuran apa pun menggunakan sintaks akses:
PS: Saya sudah menguji ini, dan sintaks yang sama berfungsi (baik sebagai lvalue dan rvalue) pada kompiler g ++ 14 dan g ++ 11.
sumber
Coba lakukan ini:
sumber
Di sini, saya punya dua opsi. Yang pertama menunjukkan konsep array array atau pointer dari pointer. Saya lebih suka yang kedua karena alamatnya berdekatan, seperti yang Anda lihat pada gambar.
sumber
Jika proyek Anda CLI (Dukungan Runtime Bahasa Biasa) , maka:
Anda bisa menggunakan kelas array, bukan yang Anda dapatkan saat menulis:
Dengan kata lain, bukan kelas array yang tidak dikelola yang Anda dapatkan saat menggunakan std namespace dan ketika menyertakan header array, bukan kelas array yang tidak dikelola yang didefinisikan dalam namespace std dan di header array, tetapi kelas array yang dikelola dari CLI.
dengan kelas ini, Anda dapat membuat array dari peringkat apa pun yang Anda inginkan.
Kode berikut di bawah ini membuat array dua dimensi baru 2 baris dan 3 kolom dan tipe int, dan saya beri nama "arr":
Sekarang Anda dapat mengakses elemen dalam array, dengan nama itu dan menulis hanya satu tanda kurung
[]
, dan di dalamnya, tambahkan baris dan kolom, dan pisahkan dengan koma,
.Kode berikut di bawah ini mengakses elemen di baris ke-2 dan kolom ke-1 dari array yang sudah saya buat di kode sebelumnya di atas:
hanya menulis baris ini untuk membaca nilai dalam sel itu, yaitu mendapatkan nilai dalam sel ini, tetapi jika Anda menambahkan sama
=
tanda , Anda akan menulis nilai dalam sel itu, yaitu mengatur nilai dalam sel ini. Anda juga dapat menggunakan operator + =, - =, * = dan / = untuk angka saja (int, float, double, __int16, __int32, __int64 dan lain-lain), tetapi yakin Anda sudah mengetahuinya.Jika proyek Anda bukan CLI, maka Anda dapat menggunakan kelas array yang tidak dikelola dari namespace std, jika Anda
#include <array>
, tentu saja, tetapi masalahnya adalah bahwa kelas array ini berbeda dari array CLI. Buat array jenis ini sama seperti CLI, kecuali Anda harus menghapus^
tanda dangcnew
kata kunci. Namun sayangnya parameter int kedua dalam<>
tanda kurung menentukan panjang (ukurannya) dari array, bukan peringkatnya!Tidak ada cara untuk menentukan peringkat dalam array semacam ini, peringkat adalah fitur array CLI saja. .
array std berperilaku seperti array normal di c ++, yang Anda tetapkan dengan pointer, misalnya
int*
dan kemudiannew int[size]
:, atau tanpa pointer:,int arr[size]
tetapi tidak seperti array normal dari c ++, array std menyediakan fungsi yang dapat Anda gunakan dengan elemen-elemen array, seperti mengisi, memulai, mengakhiri, ukuran, dan lain-lain, tetapi array normal tidak memberikan apa-apa .Tetapi array masih std adalah array satu dimensi, seperti array c ++ normal. Tetapi berkat solusi yang orang lain sarankan tentang bagaimana Anda dapat membuat normal c ++ array satu dimensi ke array dua dimensi, kita dapat mengadaptasi ide yang sama ke std array, misalnya menurut ide Mehrdad Afshari, kita dapat menulis kode berikut:
Baris kode ini menciptakan "jug array" , yang merupakan array satu dimensi yang masing-masing selnya atau menunjuk ke array satu dimensi lainnya.
Jika semua array satu dimensi dalam array satu dimensi sama panjang / ukurannya, maka Anda dapat memperlakukan variabel array2d sebagai array dua dimensi nyata, plus Anda dapat menggunakan metode khusus untuk memperlakukan baris atau kolom, tergantung pada bagaimana Anda melihatnya dalam pikiran, dalam array 2D, array std mendukung.
Anda juga dapat menggunakan solusi Kevin Loney:
tetapi jika Anda menggunakan std array, kode tersebut harus terlihat berbeda:
Dan masih memiliki fungsi unik dari std array.
Perhatikan bahwa Anda masih dapat mengakses elemen-elemen dari array std menggunakan
[]
tanda kurung, dan Anda tidak harus memanggilat
fungsi. Anda juga dapat mendefinisikan dan menetapkan variabel int baru yang akan menghitung dan mempertahankan jumlah total elemen dalam array std, dan menggunakan nilainya, alih-alih mengulangisizeX*sizeY
Anda dapat menentukan kelas generik array dua dimensi Anda sendiri, dan menentukan konstruktor dari kelas array dua dimensi untuk menerima dua bilangan bulat untuk menentukan jumlah baris dan kolom dalam array dua dimensi baru, dan menentukan fungsi get yang menerima dua parameter bilangan bulat yang mengakses elemen dalam array dua dimensi dan mengembalikan nilainya, dan mengatur fungsi yang menerima tiga parameter, bahwa keduanya pertama adalah bilangan bulat yang menentukan baris dan kolom dalam array dua dimensi, dan parameter ketiga adalah nilai baru dari elemen. Jenisnya tergantung pada jenis yang Anda pilih di kelas generik.
Anda akan dapat menerapkan semua ini dengan menggunakan salah satu c yang normal ++ array (pointer atau tanpa) atau std array dan penggunaan salah satu ide bahwa orang-orang lain yang disarankan, dan membuatnya mudah untuk digunakan seperti array cli, atau seperti dua array dimensi yang dapat Anda tetapkan, tetapkan, dan gunakan dalam C #.
sumber
Mulailah dengan mendefinisikan array menggunakan pointer (Baris 1):
sumber
Contoh di bawah ini dapat membantu,
sumber
Jika Anda menginginkan array bilangan bulat 2d, elemen mana yang dialokasikan secara berurutan dalam memori, Anda harus mendeklarasikannya seperti
di mana alih-alih x Anda dapat menulis dimensi apa pun, tetapi n harus sama di dua tempat. Contoh
harus mencetak 6.
sumber
Saya telah meninggalkan Anda dengan solusi yang paling cocok untuk saya, dalam beberapa kasus. Terutama jika seseorang tahu [ukuran?] Satu dimensi array. Sangat berguna untuk array karakter, misalnya jika kita membutuhkan berbagai array ukuran char [20].
Kuncinya adalah tanda kurung dalam deklarasi array.
sumber
Saya menggunakan sistem yang tidak elegan tapi CEPAT, MUDAH dan BEKERJA ini. Saya tidak mengerti mengapa tidak bisa bekerja karena satu-satunya cara bagi sistem untuk memungkinkan membuat array ukuran besar dan mengakses bagian adalah tanpa memotongnya menjadi beberapa bagian:
sumber
Saya tidak tahu pasti apakah jawaban berikut tidak diberikan tetapi saya memutuskan untuk menambahkan beberapa optimasi lokal ke alokasi array 2d (misalnya, matriks persegi dilakukan hanya melalui satu alokasi):
int** mat = new int*[n]; mat[0] = new int [n * n];
Namun, penghapusan berjalan seperti ini karena linearitas alokasi di atas:
delete [] mat[0]; delete [] mat;
sumber
mendeklarasikan array 2D secara dinamis:
Sekarang dalam kode di atas kami mengambil pointer ganda dan menetapkannya memori dinamis dan memberikan nilai kolom. Di sini memori yang dialokasikan hanya untuk kolom, sekarang untuk baris kita hanya perlu untuk loop dan menetapkan nilai untuk setiap baris memori dinamis. Sekarang kita bisa menggunakan pointer persis seperti kita menggunakan array 2D. Dalam contoh di atas kita kemudian menetapkan angka acak ke array 2D (penunjuk). Semua tentang DMA array 2D.
sumber
Saya menggunakan ini saat membuat array dinamis. Jika Anda memiliki kelas atau struct. Dan ini berhasil. Contoh:
sumber