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.
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.
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, tidak hanya itu, pointer juga 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, tidak hanya itu, pointer juga 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.
Baca Juga:
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.
Pointer ke array adalah salah satu konsep yang sangat penting dalam pemrograman C, yang memungkinkan manipulasi data dengan cara yang lebih fleksibel dan efisien. Pemahaman tentang pointer ke array memberikan landasan kuat dalam memanfaatkan kemampuan tingkat rendah dari bahasa C, khususnya dalam pengelolaan memori dan operasi data secara dinamis.
Array adalah struktur data yang menyimpan elemen-elemen dengan tipe data yang sama dalam lokasi memori yang berurutan. Dalam penggunaannya, array sering kali diakses menggunakan indeks untuk merujuk pada elemen tertentu. Namun, ketika pointer digunakan, akses ke elemen-elemen array menjadi lebih dinamis, karena pointer langsung menunjuk ke lokasi memori tempat data array disimpan. Hal ini memungkinkan operasi yang lebih cepat dibandingkan penggunaan indeks secara langsung.
Pointer adalah variabel yang menyimpan alamat memori dari variabel lain. Ketika sebuah array dideklarasikan, nama array itu sendiri sebenarnya adalah pointer yang menunjuk ke elemen pertama array. Dengan memahami konsep ini, manipulasi elemen array melalui pointer menjadi mungkin. Contohnya, dengan menggunakan pointer, elemen-elemen array dapat diakses, diubah, atau bahkan dimodifikasi dalam pola tertentu tanpa bergantung pada indeks.
Salah satu keuntungan utama menggunakan pointer ke array adalah efisiensi dalam pengolahan data. Karena pointer bekerja langsung dengan alamat memori, overhead yang dihasilkan oleh operasi indeks dapat diminimalkan. Selain itu, pointer memungkinkan penerapan algoritma yang lebih kompleks, seperti iterasi melalui array dengan langkah tertentu, atau pengoperasian pada sub-array tanpa perlu menyalin data. Hal ini sangat berguna dalam pengembangan perangkat lunak yang memerlukan performa tinggi, seperti sistem tertanam atau aplikasi waktu nyata.
Selain efisiensinya, pointer ke array juga memungkinkan fleksibilitas yang lebih besar dalam pengelolaan memori. Dengan menggunakan pointer, array dapat dialokasikan secara dinamis selama waktu eksekusi program. Ini memberikan kemampuan untuk membuat array dengan ukuran yang dapat berubah sesuai kebutuhan, sehingga meminimalkan pemborosan memori. Pengelolaan memori dinamis ini sangat penting dalam aplikasi yang melibatkan jumlah data yang tidak diketahui sebelumnya, seperti pemrosesan data yang diterima dari pengguna atau jaringan.
Namun, penggunaan pointer ke array memerlukan kehati-hatian yang tinggi. Salah satu tantangan utama adalah memastikan bahwa pointer selalu menunjuk ke lokasi memori yang valid. Kesalahan seperti dereferensi pointer yang tidak diinisialisasi atau mencoba mengakses memori di luar batas array dapat menyebabkan perilaku yang tidak terduga, termasuk kerusakan memori atau crash program. Oleh karena itu, validasi pointer dan pengelolaan batas array menjadi aspek penting yang harus diperhatikan dalam pemrograman.
Selain tantangan teknis, pointer ke array juga memerlukan pemahaman mendalam tentang bagaimana memori dikelola dalam bahasa C. Misalnya, dalam konteks array multidimensi, penggunaan pointer menjadi lebih kompleks karena harus mempertimbangkan bagaimana elemen-elemen array disusun di memori. Array dua dimensi, misalnya, sering dianggap sebagai array dari pointer ke array lainnya. Pemahaman tentang pengaturan memori ini sangat penting untuk menghindari kesalahan logika yang dapat merusak program.
Dalam dunia pengembangan perangkat lunak, pointer ke array memiliki berbagai aplikasi praktis. Salah satu contoh penggunaannya adalah dalam pengelolaan string, dimana pointer sering digunakan untuk memanipulasi karakter-karakter dalam string dengan cara yang efisien. Pointer juga digunakan secara luas dalam operasi dengan file, dimana buffer data diakses dan dimanipulasi menggunakan pointer ke array. Selain itu, dalam algoritma pencarian dan pengurutan, pointer memberikan fleksibilitas yang memungkinkan pengembangan solusi yang lebih cepat dan efisien.
Manfaat lain dari pointer ke array adalah kemampuannya untuk mendukung abstraksi yang lebih tinggi dalam pemrograman. Sebagai contoh, fungsi dalam bahasa C sering kali menerima array sebagai argumen dengan menggunakan pointer. Hal ini memungkinkan fungsi untuk bekerja pada data array tanpa perlu menyalin seluruh array ke dalam fungsi. Dengan cara ini, pointer membantu menghemat memori dan waktu eksekusi, terutama untuk array dengan ukuran besar.
Pemahaman mendalam tentang pointer ke array juga sangat penting untuk bekerja dengan pustaka standar C, yang banyak menggunakan pointer untuk operasi array. Sebagai contoh, fungsi-fungsi seperti `memcpy`, `memmove`, dan `qsort` bergantung pada pointer untuk melakukan operasi pada data array. Dengan memahami bagaimana pointer bekerja, pemrogram dapat memanfaatkan pustaka ini dengan lebih efektif, mempercepat pengembangan aplikasi, dan mengurangi kemungkinan kesalahan.
Meskipun pointer ke array menawarkan banyak keuntungan, tantangan yang dihadapinya tidak boleh diabaikan. Kesalahan dalam pengelolaan pointer dapat menyebabkan masalah yang sulit diidentifikasi, seperti kebocoran memori atau kerusakan data. Oleh karena itu, pembelajaran dan praktik yang hati-hati sangat diperlukan untuk menguasai konsep ini. Pemrograman dengan pointer juga memerlukan disiplin tinggi dalam menulis kode yang terstruktur dan terdokumentasi dengan baik.
Dalam keseluruhan konteks pemrograman C, pointer ke array adalah alat yang sangat kuat yang memberikan kontrol tingkat rendah terhadap data dan memori. Dengan menguasai konsep ini, seorang pemrogram dapat mengembangkan aplikasi yang tidak hanya efisien, tetapi juga mampu menangani tantangan kompleksitas data dan performa. Namun, kekuatan ini datang dengan tanggung jawab untuk memahami dan menerapkan prinsip-prinsip pengelolaan memori dengan benar, memastikan program yang dihasilkan aman, handal, dan dapat diandalkan.
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