Ada beberapa kesulitan dengan pointer:
- Mengasingkan Kemungkinan mengubah nilai suatu objek menggunakan berbagai nama / variabel.
- Non-lokalitas Kemungkinan mengubah nilai objek dalam konteks yang berbeda dari yang dinyatakannya (ini juga terjadi dengan argumen yang dilewatkan oleh referensi).
- Ketidakcocokan seumur hidup Masa pakai penunjuk mungkin berbeda dari masa objek yang ditunjuknya, dan itu dapat menyebabkan referensi yang tidak valid (SEGFAULTS) atau sampah.
- Aritmatika Pointer . Beberapa bahasa pemrograman memungkinkan manipulasi pointer sebagai integer, dan itu berarti bahwa pointer dapat menunjuk ke mana saja (termasuk tempat-tempat yang paling tidak terduga ketika ada bug). Untuk menggunakan aritmatika pointer dengan benar, seorang programmer harus menyadari ukuran memori dari objek yang ditunjuk, dan itu sesuatu yang lebih untuk dipikirkan.
- Type Casts Kemampuan untuk melemparkan pointer dari satu jenis ke yang lain memungkinkan penimpaan memori dari suatu objek yang berbeda dari yang dimaksud.
Itu sebabnya seorang programmer harus berpikir lebih teliti ketika menggunakan pointer (saya tidak tahu tentang dua level abstraksi ). Ini adalah contoh kesalahan khas yang dilakukan oleh seorang pemula:
Pair* make_pair(int a, int b)
{
Pair p;
p.a = a;
p.b = b;
return &p;
}
Perhatikan bahwa kode seperti di atas sangat masuk akal dalam bahasa yang tidak memiliki konsep pointer tetapi salah satu nama (referensi), objek, dan nilai, sebagai bahasa pemrograman fungsional, dan bahasa dengan pengumpulan sampah (Java, Python) tidak .
Kesulitan dengan fungsi rekursif terjadi ketika orang-orang tanpa latar belakang matematika yang cukup (di mana sifat rekursif adalah umum dan diperlukan) mencoba untuk mendekati mereka dengan berpikir bahwa fungsi tersebut akan berperilaku berbeda tergantung pada berapa kali telah dipanggil sebelumnya . Masalah itu diperparah karena fungsi rekursif memang dapat dibuat dengan cara di mana Anda harus berpikir seperti itu untuk memahaminya.
Pikirkan fungsi rekursif dengan pointer yang dibagikan, seperti dalam implementasi prosedural dari Pohon Merah-Hitam di mana struktur data dimodifikasi di tempat; itu adalah sesuatu yang lebih sulit untuk dipikirkan daripada rekan fungsional .
Tidak disebutkan dalam pertanyaan, tetapi masalah penting lainnya yang membuat siswa kesulitan adalah konkurensi .
Seperti yang telah disebutkan orang lain, ada masalah tambahan, non-konseptual dengan beberapa konstruksi bahasa pemrograman: itu adalah bahwa bahkan jika kita mengerti, kesalahan sederhana dan jujur dengan konstruksi itu bisa sangat sulit untuk di-debug.