Biarkan saya mencoba dan menjawab ini juga.
Pointer mirip dengan referensi. Dengan kata lain, itu bukan salinan, melainkan cara untuk merujuk pada nilai asli.
Sebelum hal lain, satu tempat di mana Anda harus sering menggunakan pointer adalah ketika Anda berurusan dengan perangkat keras yang tertanam . Mungkin Anda perlu beralih status pin IO digital. Mungkin Anda sedang memproses interupsi dan perlu menyimpan nilai di lokasi tertentu. Anda mendapatkan fotonya. Namun, jika Anda tidak berurusan dengan perangkat keras secara langsung dan hanya bertanya-tanya tentang jenis yang akan digunakan, baca terus.
Mengapa menggunakan pointer dibandingkan dengan variabel normal? Jawabannya menjadi lebih jelas ketika Anda berurusan dengan tipe kompleks, seperti kelas, struktur, dan array. Jika Anda menggunakan variabel normal, Anda mungkin akhirnya membuat salinan (kompiler cukup pintar untuk mencegah hal ini dalam beberapa situasi dan C ++ 11 juga membantu, tetapi kami akan menjauh dari diskusi itu untuk saat ini).
Sekarang apa yang terjadi jika Anda ingin mengubah nilai asli? Anda dapat menggunakan sesuatu seperti ini:
MyType a; //let's ignore what MyType actually is right now.
a = modify(a);
Itu akan bekerja dengan baik dan jika Anda tidak tahu persis mengapa Anda menggunakan pointer, Anda tidak harus menggunakannya. Waspadalah terhadap alasan "mereka mungkin lebih cepat". Jalankan tes Anda sendiri dan jika itu sebenarnya lebih cepat, maka gunakanlah.
Namun, katakanlah Anda sedang memecahkan masalah di mana Anda perlu mengalokasikan memori. Ketika Anda mengalokasikan memori, Anda harus membatalkan alokasi itu. Alokasi memori mungkin berhasil atau tidak. Di sinilah pointer berguna - mereka memungkinkan Anda untuk menguji keberadaan objek yang telah Anda alokasikan dan mereka memungkinkan Anda untuk mengakses objek yang dialokasikan memori dengan de-referensi pointer.
MyType *p = NULL; //empty pointer
if(p)
{
//we never reach here, because the pointer points to nothing
}
//now, let's allocate some memory
p = new MyType[50000];
if(p) //if the memory was allocated, this test will pass
{
//we can do something with our allocated array
for(size_t i=0; i!=50000; i++)
{
MyType &v = *(p+i); //get a reference to the ith object
//do something with it
//...
}
delete[] p; //we're done. de-allocate the memory
}
Ini adalah kunci mengapa Anda akan menggunakan pointer - referensi menganggap elemen yang Anda referensi sudah ada . Pointer tidak.
Alasan lain mengapa Anda akan menggunakan pointer (atau setidaknya harus berurusan dengan pointer) adalah karena mereka adalah tipe data yang ada sebelum referensi. Oleh karena itu, jika Anda akhirnya menggunakan perpustakaan untuk melakukan hal-hal yang Anda tahu mereka lebih baik, Anda akan menemukan bahwa banyak perpustakaan ini menggunakan pointer di semua tempat, hanya karena berapa lama mereka sudah ada (banyak dari mereka ditulis sebelum C ++).
Jika Anda tidak menggunakan pustaka apa pun, Anda bisa mendesain kode Anda sedemikian rupa sehingga Anda bisa menjauh dari pointer, tetapi mengingat bahwa pointer adalah salah satu jenis dasar bahasa, semakin cepat Anda merasa nyaman menggunakannya, semakin banyak portabel keterampilan C ++ Anda akan.
Dari sudut pandang rawatan, saya juga harus menyebutkan bahwa ketika Anda menggunakan pointer, Anda harus menguji validitasnya dan menangani kasing ketika tidak valid, atau, anggap saja valid dan terima fakta bahwa Anda Program akan macet atau lebih buruk KAPAN asumsi rusak. Dengan kata lain, pilihan Anda dengan pointer adalah memperkenalkan kompleksitas kode atau upaya pemeliharaan lebih banyak ketika sesuatu rusak dan Anda mencoba melacak bug yang dimiliki seluruh kelas kesalahan yang diperkenalkan pointer, seperti kerusakan memori.
Jadi jika Anda mengontrol semua kode Anda, menjauhlah dari pointer dan alih-alih menggunakan referensi, pertahankan konstanta ketika Anda bisa. Ini akan memaksa Anda untuk berpikir tentang masa hidup objek Anda dan pada akhirnya akan menjaga kode Anda lebih mudah dimengerti.
Hanya ingat perbedaan ini: Referensi pada dasarnya adalah pointer yang valid. Pointer tidak selalu valid.
Jadi, apakah saya mengatakan bahwa tidak mungkin membuat referensi yang tidak valid? Tidak. Ini sangat mungkin, karena C ++ memungkinkan Anda melakukan hampir semua hal. Ini lebih sulit untuk dilakukan tanpa sengaja dan Anda akan kagum pada berapa banyak bug yang tidak disengaja :)