Pointer Ke Array Bahasa C dan Penjelasannya
Pada artikel ini akan dijelaskan tentang pointer to array pada bahasa C, beserta penggunaannya dalam dunia pemrograman.
Contoh:
Sintak:
data_type (*var_name)[size_of_array];
Contoh Penulisan Pointer Ke Array:
int (*ptr)[10];
Pada contoh tersebut terdapat sebuah pointer dengan nama ptr yang mengarah ke array dari sepuluh nilai integer. Karena subscript memiliki nilai precedensi yang lebih besar dari nilai indireksi, maka sangat penting untuk dilakukan enclose operator indireksi dan nama pointer yang terdapat di dalam tanda kurung. Berikut adalah tipe dari pointer untuk jenis 'pointer ke array dari sepuluh integer'.
Tipe dasar dari p adalah integer, sementara tipe dasar dari ptr adalah array dari lima integer. Pada konsep pointer to array diketahui bahwa aritmatika pointer ditampilkan secara relatif ke ukuran dasarnya, sehingga jika ditulis ptr++, maka pointer ptr akan digeser ke depan sebanyak 20 byte.
Ketika dilakukan dereferensi ekspresi pointer, didapatkan nilai yang ditunjukkan oleh ekspresi dari suatu pointer, dimana pointer to array akan menunjuk ke nilai array itu sendiri, sehingga pada dereferensi yang sedang terjadi didapatkan nilai array dan nama array yang menunjuk ke alamat dasar tersebut. Jadi, setiap kali pointer to array direferensikan, maka akan didapatkan alamat dasar dari array yang ditunjuknya.
Sebelum memahami lebih dalam materi tentang Pointer Ke Array Bahasa C dan Penjelasannya, terlebih dahulu pelajari materi tentang: Perbedaan Antara const char *p, char * const p, dan const char * const p Bahasa C, Keyword Restrict Bahasa C Beserta Penjelasannya, dan Linked List Bahasa C Beserta Fungsi dan Penjelasannya.
#include <stdio.h>
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int *ptr = arr;
printf ("\n %d",&ptr);
return 0;
}
Pada contoh program sebelumnya, terdapat pointer ptr yang menunjuk ke elemen ke-0 dari suatu array. Hal ini sama saja dengan cara pendeklarasian sebuah pointer yang dapat menunjuk ke seluruh bagian array ketimbang hanya menunjuk salah satu dari elemen yang dimiliki oleh array tersebut. Pointer jenis ini sangat berguna ketika membahas tentang array multidimensi.
Sintak:
data_type (*var_name)[size_of_array];
Contoh Penulisan Pointer Ke Array:
int (*ptr)[10];
Pada contoh tersebut terdapat sebuah pointer dengan nama ptr yang mengarah ke array dari sepuluh nilai integer. Karena subscript memiliki nilai precedensi yang lebih besar dari nilai indireksi, maka sangat penting untuk dilakukan enclose operator indireksi dan nama pointer yang terdapat di dalam tanda kurung. Berikut adalah tipe dari pointer untuk jenis 'pointer ke array dari sepuluh integer'.
Catatan: pointer yang menunjuk ke elemen ke-0 dari suatu array dan pointer yang menunjuk ke seluruh elemen array memiliki perbedaan jenis array, seperti diperlihatkan pada contoh berikut.
Tipe dasar dari p adalah integer, sementara tipe dasar dari ptr adalah array dari lima integer. Pada konsep pointer to array diketahui bahwa aritmatika pointer ditampilkan secara relatif ke ukuran dasarnya, sehingga jika ditulis ptr++, maka pointer ptr akan digeser ke depan sebanyak 20 byte.
Baca Juga:
Ketika dilakukan dereferensi ekspresi pointer, didapatkan nilai yang ditunjukkan oleh ekspresi dari suatu pointer, dimana pointer to array akan menunjuk ke nilai array itu sendiri, sehingga pada dereferensi yang sedang terjadi didapatkan nilai array dan nama array yang menunjuk ke alamat dasar tersebut. Jadi, setiap kali pointer to array direferensikan, maka akan didapatkan alamat dasar dari array yang ditunjuknya.
Pointer dan Array Dua Dimensi
Pada array dua dimensi, dapat dilakukan akses ke setiap elemen yang dimiliki oleh suatu array dengan menggunakan dua subscripts, dimana subscript pertama merepresentasikan nilai baris dan subscript kedua merepresentasikan nilai kolom. Elemen dari array dua dimensi dapat diakses dengan bantuan dari notasi pointer.
Misalkan arr adalah array dua dimensi, maka dapat dilakukan akses ke elemen apa saja pada array arr[i][j], yang berasal dari array yang menggunakan ekspresi pointer *(*(arr + i) + j). Perhatikan contoh ekspresi berikut:
Dibuat sebuah array dua dimensi sebagai berikut arr[3][4]:
int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
Karena memori pada komputer diatur secara linier, maka tidak mungkin dilakukan penyimpanan array dua dimensi dalam baris dan kolom. Jadi, konsep baris dan kolom pada array dua dimensi hanya konsep teoretis saja, sebenarnya, array dua dimensi yang disimpan ditempatkan pada urutan baris utama, dimana baris-baris tersebut ditempatkan secara bersebelahan.
Setiap baris dapat dianggap sebagai array satu dimensi, sehingga array dua dimensi dapat dianggap sebagai kumpulan dari array satu dimensi yang ditempatkan satu demi satu secara berurutan. Dengan kata lain, array dua dimensi merupakan arrau satu dimensi yang ditempatkan secara berurutan satu demi satu. Pada contoh yang diperlihatkan sebelumnya, diberitahukan bahwa array arr merupakan array tiga elemen, dimana setiap elemen yang terdapat pada array tersebut merupakan array satu dimensi dari 4 bilangan bulat.
Diketahui pula bahwa, array merupakan pointer konstan yang menunjuk ke array satu dimensi pada elemen ke-0 dan berisi alamat 5000. Karena arr adalah 'pointer ke array 4 bilangan bulat', maka menurut aturan aritmatika pointer, ekspresi arr + 1 akan mewakili alamat 5016 dan ekspresi arr + 2 akan mewakili alamat 5032.
Jadi, dapat dikatakan bahwa arr menunjuk ke array satu dimensi dari elemen ke-0, sedangkan arr + 1 menunjuk ke array satu dimensi elemen ke-1, dan arr + 2 menunjuk ke array satu dimensi pada elemen ke-2.
Secara Umum Penulisan Pointer Ke Array, diperlihatkan sebagai berikut:
arr + i menunjuk ke elemen array
Karena arr + i menunjuk ke elemen ke-i dari arr, maka pada dereferensi akan didapatkan elemen ke-i dari arr yang tentu saja merupakan array satu dimensi. Jadi ekspresi *(arr + i) tersebut akan memberikan nilai dari alamat dasar dari array satu dimensi ke ke-i.
Ekspresi penunjuk *(arr + i) setara dengan ekspresi subskrip arr[i]. Jadi, *(arr + i) yang sama dengan nilai arr[i] akan memberi alamat dasar dari array satu dimensi ke ke-i. Untuk mengakses elemen individu dari larik 2-D kita, kita harus dapat mengakses elemen ke-j dari larik 1-D ke-i. Karena tipe dasar dari *(arr + i) adalah int dan berisi alamat elemen ke-0 dari array satu dimensi ke-i, maka bisa didapatkan alamat dari elemen berikutnya dalam array satu dimensi dengan menambahkan nilai bilangan bulat ke *( arr + i). Misalnya, *(arr + i) + 1 akan mewakili alamat elemen pertama dari elemen 1 dari array satu dimensi ke-i dan *(arr+i)+2 akan mewakili alamat elemen ke-2 dari array satu dimensi ke-i. Demikian pula *(arr + i) + j akan mewakili alamat elemen j dari array satu dimensi ke-i.
Perhatikan array tiga dimensi tipe integer berikut int arr[2][3][2] = { {{5, 10}, {6, 11}, {7, 12}}, {{20, 30}, { 21, 31}, {22, 32}}};
Array tiga dimensi yang telah dibuat tersebut, kemudian dianggap array ketiga sebagai array dua dimensi, dimana setiap elemen array tiga dimensi dianggap sebagai array dua dimensi. Array tiga dimensi dapat dianggap sebagai array yang terdiri dari dua elemen dimana setiap elemen adalah array dua dimensi. Nama array arr merupakan penunjuk ke array dua dimensi pada elemen ke-0.
Jadi, ekspresi penunjuk *(*(*(arr + i ) + j ) + k) adalah setara dengan ekspresi subskrip arr[i][j][k]. Dimana ekspresi *(arr + i) adalah setara dengan arr[i], dan ekspresi *(*(arr + i) + j) adalah setara dengan arr[i][j]. Sehingga dapat dikatakan bahwa arr[i] merepresentasikan alamat dasar dari array dua dimensi pada elemen ke-i dan arr[i][j] merepresentasikan alamat dasar dari array satu dimensi pada elemen ke-j.
int arr[3][4] = {{10, 11, 12, 13}, {20, 21, 22, 23}, {30, 31, 32, 33}};
int (*ptr)[4];
ptr = arr;
Karena ptr adalah pointer ke array 4 bilangan bulat, maka ptr + i akan menunjuk ke baris ke-i.
Pada dereferensi ptr + i, akan didapatkan alamat dasar dari baris ke-i. Dimana untuk mengakses alamat elemen ke-j dari baris ke-i, maka dapat ditambahkan j ke ekspresi pointer *(ptr + i). Jadi, ekspresi penunjuk *(ptr + i) + j memberikan alamat elemen ke-j dari baris ke-i, dan ekspresi penunjuk *(*(ptr + i)+j) memberikan nilai dari elemen ke-j dari baris ke-i.
Tidak hanya itu, diketahui pula bahwa ekspresi penunjuk *(*(ptr + i) + j) adalah setara dengan ekspresi subskrip ptr[i][j]. Jadi, jika dimiliki variabel pointer yang berisi alamat dasar array 2-D, maka dapat dilakukan akses ke elemen-elemen array dengan menggandakan subskrip variabel pointer tersebut.
Misalkan arr adalah array dua dimensi, maka dapat dilakukan akses ke elemen apa saja pada array arr[i][j], yang berasal dari array yang menggunakan ekspresi pointer *(*(arr + i) + j). Perhatikan contoh ekspresi berikut:
Dibuat sebuah array dua dimensi sebagai berikut arr[3][4]:
int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
Karena memori pada komputer diatur secara linier, maka tidak mungkin dilakukan penyimpanan array dua dimensi dalam baris dan kolom. Jadi, konsep baris dan kolom pada array dua dimensi hanya konsep teoretis saja, sebenarnya, array dua dimensi yang disimpan ditempatkan pada urutan baris utama, dimana baris-baris tersebut ditempatkan secara bersebelahan.
Setiap baris dapat dianggap sebagai array satu dimensi, sehingga array dua dimensi dapat dianggap sebagai kumpulan dari array satu dimensi yang ditempatkan satu demi satu secara berurutan. Dengan kata lain, array dua dimensi merupakan arrau satu dimensi yang ditempatkan secara berurutan satu demi satu. Pada contoh yang diperlihatkan sebelumnya, diberitahukan bahwa array arr merupakan array tiga elemen, dimana setiap elemen yang terdapat pada array tersebut merupakan array satu dimensi dari 4 bilangan bulat.
Diketahui pula bahwa, array merupakan pointer konstan yang menunjuk ke array satu dimensi pada elemen ke-0 dan berisi alamat 5000. Karena arr adalah 'pointer ke array 4 bilangan bulat', maka menurut aturan aritmatika pointer, ekspresi arr + 1 akan mewakili alamat 5016 dan ekspresi arr + 2 akan mewakili alamat 5032.
Jadi, dapat dikatakan bahwa arr menunjuk ke array satu dimensi dari elemen ke-0, sedangkan arr + 1 menunjuk ke array satu dimensi elemen ke-1, dan arr + 2 menunjuk ke array satu dimensi pada elemen ke-2.
Secara Umum Penulisan Pointer Ke Array, diperlihatkan sebagai berikut:
arr + i menunjuk ke elemen array
Karena arr + i menunjuk ke elemen ke-i dari arr, maka pada dereferensi akan didapatkan elemen ke-i dari arr yang tentu saja merupakan array satu dimensi. Jadi ekspresi *(arr + i) tersebut akan memberikan nilai dari alamat dasar dari array satu dimensi ke ke-i.
Ekspresi penunjuk *(arr + i) setara dengan ekspresi subskrip arr[i]. Jadi, *(arr + i) yang sama dengan nilai arr[i] akan memberi alamat dasar dari array satu dimensi ke ke-i. Untuk mengakses elemen individu dari larik 2-D kita, kita harus dapat mengakses elemen ke-j dari larik 1-D ke-i. Karena tipe dasar dari *(arr + i) adalah int dan berisi alamat elemen ke-0 dari array satu dimensi ke-i, maka bisa didapatkan alamat dari elemen berikutnya dalam array satu dimensi dengan menambahkan nilai bilangan bulat ke *( arr + i). Misalnya, *(arr + i) + 1 akan mewakili alamat elemen pertama dari elemen 1 dari array satu dimensi ke-i dan *(arr+i)+2 akan mewakili alamat elemen ke-2 dari array satu dimensi ke-i. Demikian pula *(arr + i) + j akan mewakili alamat elemen j dari array satu dimensi ke-i.
Pointer dan Array Tiga Dimensi
Pada array tiga dimensi, dapat dilakukan akses untuk setiap elemen dengan menggunakan tiga subscripts.Perhatikan array tiga dimensi tipe integer berikut int arr[2][3][2] = { {{5, 10}, {6, 11}, {7, 12}}, {{20, 30}, { 21, 31}, {22, 32}}};
Array tiga dimensi yang telah dibuat tersebut, kemudian dianggap array ketiga sebagai array dua dimensi, dimana setiap elemen array tiga dimensi dianggap sebagai array dua dimensi. Array tiga dimensi dapat dianggap sebagai array yang terdiri dari dua elemen dimana setiap elemen adalah array dua dimensi. Nama array arr merupakan penunjuk ke array dua dimensi pada elemen ke-0.
Jadi, ekspresi penunjuk *(*(*(arr + i ) + j ) + k) adalah setara dengan ekspresi subskrip arr[i][j][k]. Dimana ekspresi *(arr + i) adalah setara dengan arr[i], dan ekspresi *(*(arr + i) + j) adalah setara dengan arr[i][j]. Sehingga dapat dikatakan bahwa arr[i] merepresentasikan alamat dasar dari array dua dimensi pada elemen ke-i dan arr[i][j] merepresentasikan alamat dasar dari array satu dimensi pada elemen ke-j.
Subscripting Pointer ke Array
Misalkan arr adalah array dua dimensi dengan 3 baris dan 4 kolom, dan ptr adalah pointer ke array 4 bilangan bulat, dimana ptr berisi alamat dasar dari array arr.int arr[3][4] = {{10, 11, 12, 13}, {20, 21, 22, 23}, {30, 31, 32, 33}};
int (*ptr)[4];
ptr = arr;
Karena ptr adalah pointer ke array 4 bilangan bulat, maka ptr + i akan menunjuk ke baris ke-i.
Pada dereferensi ptr + i, akan didapatkan alamat dasar dari baris ke-i. Dimana untuk mengakses alamat elemen ke-j dari baris ke-i, maka dapat ditambahkan j ke ekspresi pointer *(ptr + i). Jadi, ekspresi penunjuk *(ptr + i) + j memberikan alamat elemen ke-j dari baris ke-i, dan ekspresi penunjuk *(*(ptr + i)+j) memberikan nilai dari elemen ke-j dari baris ke-i.
Tidak hanya itu, diketahui pula bahwa ekspresi penunjuk *(*(ptr + i) + j) adalah setara dengan ekspresi subskrip ptr[i][j]. Jadi, jika dimiliki variabel pointer yang berisi alamat dasar array 2-D, maka dapat dilakukan akses ke elemen-elemen array dengan menggandakan subskrip variabel pointer tersebut.
Referensi Tambahan:
- Anggota Structure, Padding, dan Data Packing Bahasa C
- Operasi Pada Variabel Struct Bahasa C
- Bit Fields Bahasa C Beserta Penjelasannya
- Anggota Array Fleksibel Struct Pada Bahasa C
- Perbedaan Antara Struct dan Union pada Bahasa C
- Perbedaan Struct Bahasa C dan C++
- Anonimus Union dan Struct Bahasa C dan Penjelasannya
Artikel ini didedikasikan kepada: Ahmad Choirul Umam, Alif Kusuma Dharu, Ana Sofiana, Anggreani Eka Lestari, dan Cuwi Nurti Ningrum.
6 komentar untuk "Pointer Ke Array Bahasa C dan Penjelasannya"
Hubungi admin melalui Wa : +62-896-2414-6106
Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.
Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.
- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -
Apa yang dimaksud dengan pointer to array pada Bahasa C?
BalasHapusPointer to array bahasa C merupakan suatu memori penunjuk yang digunakan untuk menunjuk alamat blok memori dari suatu variabel array.
HapusApa yang dimaksud dengan konsep pointer ke Array Bahasa C?
BalasHapusKonsep dari penerapan pointer to array bahasa C adalah suatu proses penggunaan pointer ke array yang kemudian digunakan untuk mengakses elemen pada array yang ditunjuk tersebut.
HapusApa perbedaan antara array to pointer dan pointer to array pada Bahasa C?
BalasHapusPada pointer to array, pointer digunakan untuk menyimpan alamat dari setiap array yang diberikan atau ditunjuk oleh pointer, sedangkan pada konsep array to pointer, maka array tersebut bertugas untuk menyimpan nilai dari variabel pointer.
Hapus