Perbedaan ++*p, *p++, dan *++p pada Bahasa C
#include <stdio.h>
int main(void)
{
int arr[] = {10, 20};
int *p = arr;
++*p;
printf("arr[0] = %d, arr[1] ="
" %d, *p = %d", arr[0], arr[1], *p);
return 0;
}
#include <stdio.h>
int main(void)
{
int arr[] = {10, 20};
int *p = arr;
*p++;
printf("arr[0] = %d, arr[1] ="
" %d, *p = %d", arr[0], arr[1], *p);
return 0;
}
#include <stdio.h>
int main(void)
{
int arr[] = {10, 20};
int *p = arr;
*++p;
printf("arr[0] = %d, arr[1] ="
" %d, *p = %d", arr[0], arr[1], *p);
return 0;
}
- Precedence dari prefix ++ dan * adalah sama. Asosiatifitas dari keduanya adalah dari kanan ke kiri (right to left).
- Precedence dari postfix ++ adalah lebih besar dari * dan prefix ++. Tingkat asosiatifitas dari postfix ++ adalah dari kiri ke kanan (left to right).
Operator ++*p
- Pointer p akan didereferensi terlebih dahulu untuk mengakses nilai yang ditunjukkan oleh p.
- Nilai yang diakses kemudian akan dinaikkan (incremented) satu.
- int x = 5;
- int *p = &x;
- ++*p;
Operator *p++
- Nilai yang ditunjukkan oleh p akan diakses terlebih dahulu.
- Setelah nilai diakses, pointer p akan ditingkatkan (incremented) untuk menunjuk ke elemen berikutnya.
- int arr[] = {10, 20, 30};
- int *p = arr;
- int val = *p++;
Operator *++p
- Pointer p akan ditingkatkan terlebih dahulu untuk menunjuk ke elemen berikutnya.
- Nilai yang ditunjukkan oleh p setelah peningkatan akan diakses.
- int arr[] = {10, 20, 30};
- int *p = arr;
- int val = *++p;
- ++*p: Meningkatkan nilai yang ditunjukkan oleh pointer p.
- *p++: Mengakses nilai yang ditunjukkan oleh pointer p sebelum pointer tersebut meningkat.
- *++p: Meningkatkan pointer p terlebih dahulu, kemudian mengakses nilai yang ditunjukkan oleh pointer yang telah meningkat.
- Efisiensi dalam Mengubah Data: Kombinasi ini memungkinkan perubahan nilai langsung pada lokasi memori yang ditunjuk oleh pointer. Hal ini berguna ketika pengembang perlu meningkatkan nilai secara langsung tanpa harus membuat variabel tambahan.
- Kode Lebih Ringkas: Menggunakan ++*p dapat membuat kode lebih ringkas dan mudah dibaca jika hanya perlu meningkatkan nilai yang ditunjuk oleh pointer saja.
- Manipulasi Array atau Daftar Secara Efisien: Kombinasi ini sangat berguna ketika bekerja dengan array atau daftar, karena memungkinkan akses ke nilai saat ini dan kemudian bergerak ke elemen berikutnya dalam satu operasi.
- Kode Bersih dalam Iterasi: Ketika digunakan dalam loop, maka *p++ dapat membantu membuat kode lebih bersih dan lebih mudah dibaca, karena menggabungkan dereferensi dan peningkatan pointer dalam satu langkah.
- Akses Elemen Berikutnya: Kombinasi ini berguna ketika perlu mengabaikan nilai saat ini yang ditunjukkan oleh pointer dan langsung bekerja dengan nilai berikutnya.
- Iterasi yang Tepat: Berguna dalam situasi dimana pengembang ingin memastikan pointer ditingkatkan sebelum akses, misalnya, saat mengakses elemen setelah elemen pertama dalam iterasi.
- ++*p sangat efisien untuk perubahan nilai langsung.
- *p++ ideal untuk iterasi dan akses nilai saat ini sebelum peningkatan.
- *++p cocok untuk akses elemen berikutnya dalam iterasi atau pengolahan data.
- Potensi Kesalahan Logika: Menggunakan ++*p dapat menyebabkan kebingungan jika tidak dipahami dengan baik, karena operasi ini meningkatkan nilai yang ditunjukkan oleh pointer, bukan pointer itu sendiri. Ini dapat menyebabkan kesalahan logika jika pengembang salah mengira bahwa pointer yang ditingkatkan.
- Kesulitan Debugging: Jika terjadi kesalahan, menemukan dan memahami mengapa nilai tertentu berubah bisa menjadi sulit karena operasi yang dilakukan langsung pada nilai yang ditunjukkan oleh pointer.
- Kebingungan dalam Urutan Operasi: *p++ bisa membingungkan karena mencampur akses nilai dan peningkatan pointer dalam satu ekspresi. Ini seringkali sulit dipahami oleh pengembang pemula.
- Bugs dalam Loop: Jika digunakan dalam loop atau operasi berulang, kesalahan dalam memahami urutan operasi bisa menyebabkan loop berakhir lebih cepat atau lebih lambat dari yang diharapkan.
- Mengabaikan Nilai Pertama: Menggunakan *++p dalam iterasi bisa menyebabkan nilai pertama diabaikan, yang mungkin tidak diinginkan dalam beberapa kasus.
- Kebingungan dalam Implementasi: Sama seperti *p++, *++p juga bisa membingungkan dalam hal urutan operasi, terutama bagi pengembang yang tidak terbiasa dengan operator pointer dan increment.
- Kebingungan Urutan Operasi: Urutan operasi yang tidak intuitif bisa menyebabkan kesalahan dan kesalahpahaman.
- Potensi Kesalahan Logika: Kesalahan dalam memahami apakah nilai atau pointer yang ditingkatkan bisa menyebabkan bug yang sulit ditemukan.
- Kesulitan Debugging: Karena operasi ini cukup kompleks, menemukan dan memperbaiki bug bisa menjadi lebih sulit.
Kesimpulan
- Fakta tentang Sizeof pada Bahasa C
- 5 Fakta Antara Strlen vs Sizeof pada Bahasa C
- 4 Contoh Program Operator Stringsizing dan Tokenpasting pada Bahasa C
- Penjelasan Singkat, Makro PRINT() pada Bahasa C
- Variabel Panjang Argumen Untuk Makro pada Bahasa C
- Fakta dan Penjelasan Makro Multibaris pada Bahasa C
- Fakta dan Penjelasan Makro Offset pada Bahasa C
6 komentar untuk "Perbedaan ++*p, *p++, dan *++p pada Bahasa C"
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 atau variabel pointer dalam bahasa pemrograman C?
BalasHapusPointer adalah variabel yang nilainya adalah alamat memori dari variabel lain, yaitu berupa alamat langsung dari lokasi memori variabel yang dituju tersebut. Seperti halnya variabel atau bentuk konstanta apapun, penggunaan variabel pointer harus dideklarasikan terlebih dahulu sebelum pointer (variabel) tersebut dapat digunakan untuk menyimpan alamat variabel apapun.
Hapusbentuk penulisan dari variabel yang digunakan sebagai pointer adalah diberi tanda '*' pada bagian awal sebelum nama variabel. Contoh: int *p;
HapusPointer adalah variabel yang menyimpan alamat memori dari variabe lain. Pointer digunakan untuk menyimpan alamat variabel lain atau item memori dari variabel lain. Pointer sangat berguna untuk jenis parameter passing lainnya yang biasa disebut sebagai Pass By Address. Pointer sangat penting dalam pembuatan program untuk alokasi memori dinamis.
BalasHapusApakah variabel tipe pointer dapat digunakan secara bersamaan dengan operator increment ataupun decrement?
BalasHapusIya, seperti diperlihatkan pada contoh-contoh dalam artikel ini.
Hapus