Lompat ke konten Lompat ke sidebar Lompat ke footer

Perbedaan ++*p, *p++, dan *++p pada Bahasa C

Artikel ini membahasa Perbedaan antara ++*p, *p++, dan *++p pada bahasa pemrograman C. Untuk lebih memahami, perkirakan hasil output dari contoh program berikut.


Sebelum memahami lebih dalam materi tentang Perbedaan ++*p, *p++, dan *++p pada Bahasa C, terlebih dahulu pelajari materi tentang: Preincrement dan Predecrement Bahasa C dan Fungsinya, Operator Ternary Bahasa C dan Fungsinya, dan Program Modulus Angka Negatif Bahasa C.

Dalam pemrograman C, operator penunjuk (pointer) dan operator penambahan (increment) sering digunakan bersama untuk mengakses dan memanipulasi data di lokasi memori yang berbeda. Tiga kombinasi umum yang sering membingungkan adalah ++*p, *p++, dan *++p. Masing-masing kombinasi ini memiliki cara kerja yang berbeda, dan memahami perbedaannya sangat penting untuk menghindari kesalahan pemrograman. Mari bahas masing-masing secara detail.

Contoh:

#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

}


Contoh:

#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

}


Contoh:

#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

}


Hasil dari keluaran program sebelumnya akan mudah diprediksi dengan mengingat beberapa penerapan aturan mengenai operator postfix ++ dan prefix ++.
  • 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).

Bentuk ekspresi ++*p memiliki dua operator yang memiliki precedence sama, sehingga kompilator selanjutnya akan melihat tingkat asosiatifitasnya. Karena ssosiatifitas dari operator adalah kanan ke kiri, maka bentuk ekspresinya yang dibaca adalah ++(*p), sehingga ouput dari program pertama adalah "arr[0]=11, arr[1]=20, *p=11".

Ekspresi *p++ dibaca *(p++), sehingga precedence dari postfix ++ yang lebih tinggi dari *. Maka output dari program kedua adalah "arr[0]=10, arr[1]=20, *p=20".

Ekspresi *++p memiliki dua operator dengan precedence yang sama, sehingga kompilator akan melihat tingkat asosiatifitasnya. Karena asosiatifitas dari operator tersebut adalah dari kanan ke kiri, maka, ekspresi dari operator akan dibaca *(++p). Output dari program ketiga adalah "arr[0]=10, arr[1]=20, *p=20".

Operator ++*p

Kombinasi ini terdiri dari dua operator, yaitu operator * (dereferensi pointer) dan ++ (pre-increment). Urutannya adalah sebagai berikut:
  • Pointer p akan didereferensi terlebih dahulu untuk mengakses nilai yang ditunjukkan oleh p.
  • Nilai yang diakses kemudian akan dinaikkan (incremented) satu.

Misalkan p adalah pointer ke suatu integer, katakanlah p menunjuk ke alamat memori yang berisi nilai 5, maka:
  • int x = 5;
  • int *p = &x;
  • ++*p;
Setelah ++*p, nilai x akan menjadi 6 karena pengembang meningkatkan nilai yang ditunjukkan oleh p.

Operator *p++

Dalam kombinasi ini, operator yang digunakan adalah * (dereferensi pointer) dan ++ (post-increment). Urutannya adalah sebagai berikut:
  • Nilai yang ditunjukkan oleh p akan diakses terlebih dahulu.
  • Setelah nilai diakses, pointer p akan ditingkatkan (incremented) untuk menunjuk ke elemen berikutnya.

Misalkan p menunjuk ke elemen pertama dari array integer, maka:
  • int arr[] = {10, 20, 30};
  • int *p = arr;
  • int val = *p++;
Setelah *p++, val akan bernilai 10 (nilai dari elemen pertama array), dan pointer p akan menunjuk ke elemen kedua dari array (nilai 20).


Operator *++p

Kombinasi ini menggunakan * (dereferensi pointer) dan ++ (pre-increment). Urutannya adalah sebagai berikut:
  • Pointer p akan ditingkatkan terlebih dahulu untuk menunjuk ke elemen berikutnya.
  • Nilai yang ditunjukkan oleh p setelah peningkatan akan diakses.

Misalkan p menunjuk ke elemen pertama dari array integer, maka:
  • int arr[] = {10, 20, 30};
  • int *p = arr;
  • int val = *++p;
Setelah *++p, pointer p akan menunjuk ke elemen kedua array, dan val akan bernilai 20 (nilai dari elemen kedua array).

Perbandingan singkat:
  • ++*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.

Menggunakan operator seperti ++*p, *p++, dan *++p dalam pemrograman C dapat memberikan beberapa keuntungan tergantung pada konteks dan kebutuhan spesifik dari program yang sedang ditulis. Berikut adalah beberapa kelebihan dari masing-masing kombinasi tersebut:

Kelebihan ++*p:
  • 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.

Kelebihan *p++:
  • 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.

Kelebihan *++p:
  • 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.

Penggunaan ++*p, *p++, dan *++p dalam pemrograman C memberikan fleksibilitas dan efisiensi dalam berbagai konteks pemrograman:
  • ++*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.

Memilih kombinasi yang tepat sesuai kebutuhan spesifik akan membuat kode lebih efisien, mudah dibaca, dan lebih mudah dikelola.

Meskipun penggunaan ++*p, *p++, dan *++p dalam pemrograman C memiliki kelebihan, ada juga beberapa kekurangan yang perlu diperhatikan. Kekurangan ini terutama terkait dengan potensi kesalahan, pemahaman kode, dan pemeliharaan. Berikut adalah kekurangan dari masing-masing kombinasi:

Kekurangan ++*p:
  • 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.

Kekurangan *p++:
  • 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.

Kekurangan *++p:
  • 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.

Penggunaan ++*p, *p++, dan *++p dalam pemrograman C memang memberikan fleksibilitas dan efisiensi, tetapi juga memiliki kekurangan yang perlu diwaspadai:
  • 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.

Oleh karena itu, penting untuk memahami dengan baik bagaimana masing-masing kombinasi bekerja dan memastikan kode didokumentasikan dengan jelas untuk memudahkan pemahaman dan pemeliharaan dimasa mendatang.

Kesimpulan

Memahami perbedaan antara ++*p, *p++, dan *++p sangat penting dalam pengelolaan pointer dan manipulasi data dalam bahasa C. Kesalahan dalam penggunaan kombinasi ini dapat menyebabkan bug yang sulit ditemukan dan memperbaiki program. Dengan memahami urutan operasi yang dilakukan, pengembang dapat lebih mudah menentukan kombinasi yang tepat untuk situasi tertentu dan menulis kode yang lebih efisien dan bebas bug.

Artikel ini didedikasikan kepada: Sofiani Vitamara Agustina, Yuni Tri Winanti, Adila Kartika Dewi, Agung Kumoro Adhi, dan Akmal Mahardika.

6 komentar untuk "Perbedaan ++*p, *p++, dan *++p pada Bahasa C"

  1. Apa yang dimaksud dengan pointer atau variabel pointer dalam bahasa pemrograman C?

    BalasHapus
    Balasan
    1. Pointer 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.

      Hapus
    2. bentuk penulisan dari variabel yang digunakan sebagai pointer adalah diberi tanda '*' pada bagian awal sebelum nama variabel. Contoh: int *p;

      Hapus
  2. Pointer 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.

    BalasHapus
  3. Apakah variabel tipe pointer dapat digunakan secara bersamaan dengan operator increment ataupun decrement?

    BalasHapus
    Balasan
    1. Iya, seperti diperlihatkan pada contoh-contoh dalam artikel ini.

      Hapus

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 -