Mari kita lihat contoh berikut:
3 array 1D ini dapat direpresentasikan sebagai array 2D sebagai berikut:
Mari kita lihat contoh lain:
Array 3 1D ini tidak dapat direpresentasikan sebagai array 2D karena ukuran array berbeda.
Deklarasi larik 2D
tipe data nama-array[BARIS][COL]
- Tipe data adalah tipe data dari elemen array.
- Array-name adalah nama array.
- Dua subskrip mewakili jumlah baris dan kolom array. Jumlah total elemen array adalah ROW*COL.
int [2][3];
Dengan menggunakan kode C di atas, kita dapat mendeklarasikan sebuah bilangan bulat Himpunan, Sebuah dari ukuran 2*3 (2 Baris dan 3 Kolom).
char b[3][2];
Dengan menggunakan kode C di atas, kita dapat mendeklarasikan a karakter Himpunan, b dari ukuran 2*3 (3 Baris dan 2 Kolom).
Inisialisasi array 2DD
Kita dapat menginisialisasi selama deklarasi dengan cara berikut:
- int a[3][2] = 1,2,3,4,5,6;
- int a[][2] = 1,2,3,4,5,6;
- int a[3][2] = 1, 2,3, 4,5, 6;
- int a[][2] = 1, 2,3, 4,5, 6;
Perhatikan bahwa dalam 2 dan 4 kami belum menyebutkan 1st berlangganan. Kompiler C secara otomatis menghitung jumlah baris dari jumlah elemen. Tapi 2dan subskrip harus ditentukan. Inisialisasi berikut tidak valid:
- int a[3][] = 1,2,3,4,5,6;
- int a[][] = 1,2,3,4,5,6;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //Contoh 1.c #termasuk #tentukan baris 3 #tentukan COL 2 int utama() int i,j; int a[ROW][COL] = 1,2, 3,4, 5,6 ; printf("Elemen baris dari array a adalah :\n"); untuk(i=0;i printf("Baris %d:",i); untuk(j=0;j printf("%d",a[i][j]); printf("\n"); printf("\n\nElemen berdasarkan kolom dari array a adalah :\n"); untuk(i=0;i printf("Kolom %d:",i); untuk(j=0;j printf("%d",a[j][i]); printf("\n"); kembali 0; |
Dalam Contoh1.c, kami telah mendeklarasikan array integer ukuran 3*2 dan diinisialisasi. Untuk mengakses elemen array, kami menggunakan dua for loop.
Untuk mengakses baris-bijaksana, loop luar untuk baris, dan loop dalam untuk kolom.
Untuk mengakses kolom-bijaksana, loop luar untuk kolom, dan loop dalam untuk baris.
Perhatikan bahwa ketika kita mendeklarasikan array 2D, kita menggunakan a[2][3], yang berarti 2 baris dan 3 kolom. Pengindeksan array dimulai dari 0. Untuk mengakses 2dan baris dan 3rd kolom, kita harus menggunakan notasi a[1][2].
Pemetaan memori array 2D
Tampilan logis dari sebuah array sebuah[3][2] mungkin sebagai berikut:
Memori komputer adalah urutan byte 1D. Dalam bahasa C, array 2D disimpan dalam memori di urutan baris-utama. Beberapa bahasa pemrograman lain (mis.g., FORTRAN), disimpan di kolom-urutan utama dalam memori.
Aritmatika Pointer dari array 2D
Untuk memahami aritmatika pointer dari array 2D, pertama, lihat array 1D.
Pertimbangkan larik 1D:
Dalam susunan 1D, Sebuah adalah konstanta, dan nilainya adalah alamat 0ini lokasi array sebuah[5]. Nilai dari a+1 adalah alamat 1st lokasi array sebuah[5]. a+i adalah alamat sayaini lokasi array.
Jika kita bertambah Sebuah dengan 1, itu bertambah dengan ukuran tipe data.
sebuah[1] setara dengan *(a+1)
sebuah [2] setara dengan *(a+2)
a[i] setara dengan *(a+i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //Contoh2.c #termasuk #tentukan baris 3 #tentukan COL 2 int utama() int a[5]=10,20,30,40,50; printf("ukuran(int): %ld\n\n",ukuran(int)); printf("a: %p\n",a); printf("a+1: %p\n",a+1); printf("a+2: %p\n\n",a+2); printf("a[1]: %d, *(a+1): %d\n",a[1],*(a+1)); printf("a[2]: %d, *(a+2): %d\n",a[1],*(a+1)); printf("a[3]: %d, *(a+3): %d\n",a[1],*(a+1)); kembali 0; |
Dalam Contoh2.c, alamat memori ditampilkan dalam heksadesimal. Perbedaan antara a dan a+1 adalah 4, yang merupakan ukuran bilangan bulat dalam byte.
Sekarang, pertimbangkan array 2D:
b adalah penunjuk tipe: masuk[ ][4] atau int(*)[4]
masuk[ ][4] adalah barisan dari 4 bilangan bulat. Jika kita menambah b dengan 1, itu bertambah dengan ukuran baris.
b adalah alamat 0ini baris.
b+1 adalah alamat 1st baris.
b+i adalah alamat sayaini baris.
Ukuran baris adalah: (Jumlah kolom * sizeof(tipe data)) byte
Ukuran baris dari array integer b[3][4] adalah: 4 * sizeof(int) = 4 * 4 = 16 byte
Baris array 2D dapat dilihat sebagai array 1D. b adalah alamat 0ini baris. Jadi, kita mendapatkan yang berikut
- *b+1 adalah alamat 1st elemen dari 0ini
- *b+j adalah alamat jini elemen dari 0ini
- *(b+i) adalah alamat 0ini elemen dari sayaini
- *(b+i)+j adalah alamat jini elemen dari sayaini
- b[0][0] sama dengan **b
- b[0][1] setara dengan *(*b+1)
- b[1][0] setara dengan *(*(b+1))
- b[1][1] setara dengan *(*(b+1)+1)
- b[i][j] setara dengan *(*(b+i)+j)
Alamat b[i][j]: b + sizeof(tipe data) * ( Jumlah kolom * i + j)
Pertimbangkan larik 2D: int b[3][4]
Alamat b[2][1] adalah : b + ukuran(int) * (4*2 + 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //Contoh3.c #termasuk #tentukan baris 3 #definisikan COL 4 int utama() int i,j; int b[ROW][COL] = 10,20,30,40, 50,60,70,80, 90.100.110.120 ; printf("ukuran(int): %ld\n",ukuran(int)); printf("Ukuran Baris: %ld\n",COL*sizeof(int)); printf("b: %p\n",b); printf("b+1: %p\n",b+1); printf("b+2: %p\n",b+2); printf("*b: %p\n",*b); printf("*b+1: %p\n",*b+1); printf("*b+2: %p\n",*b+2); printf("b[0][0]: %d **b: %d\n",b[0][0],**b); printf("b[0][1]: %d *(*b+1): %d\n",b[0][1],*(*b+1)); printf("b[0][2]: %d *(*b+2): %d\n",b[0][2],*(*b+2)); printf("b[1][0]: %d *(*(b+1)): %d\n",b[1][0],*(*(b+1))); printf("b[1][1]: %d *(*(b+1)+1): %d\n",b[1][1],*(*(b+1)+1) ); kembali 0; |
Dalam Contoh3.c, kita telah melihat bahwa ukuran baris adalah 16 dalam notasi desimal. Perbedaan antara b+1 dan b adalah 10 dalam heksadesimal. 10 dalam heksadesimal setara dengan 16 dalam desimal.
Kesimpulan
Jadi, dalam artikel ini, kita telah belajar tentang
- Deklarasi larik 2D
- Inisialisasi array 2DD
- Pemetaan memori array 2D
- Aritmatika Pointer dari array 2D
Sekarang kita dapat menggunakan array 2D dalam program C kita tanpa keraguan,
Referensi
Penghargaan untuk beberapa ide dalam karya ini terinspirasi oleh kursus, Pointer dan Array 2-D, oleh Palash Dey Department of Computer Science & Engg. Institut Teknologi India Kharagpur