Bagikan melalui


Pointer const dan volatil

Kata kunci const dan volatil mengubah cara pointer diperlakukan. Kata const kunci menentukan bahwa penunjuk tidak dapat dimodifikasi setelah inisialisasi; penunjuk dilindungi dari modifikasi setelahnya.

Kata volatile kunci menentukan bahwa nilai yang terkait dengan nama berikut dapat dimodifikasi oleh tindakan selain yang ada di aplikasi pengguna. Oleh karena itu, volatile kata kunci berguna untuk mendeklarasikan objek dalam memori bersama yang dapat diakses oleh beberapa proses atau area data global yang digunakan untuk komunikasi dengan rutinitas layanan yang mengganggu.

Ketika nama dinyatakan sebagai volatile, pengkompilasi memuat ulang nilai dari memori setiap kali diakses oleh program. Ini secara dramatis mengurangi kemungkinan pengoptimalan. Namun, ketika status objek dapat berubah secara tiba-tiba, itu adalah satu-satunya cara untuk memastikan performa program yang dapat diprediksi.

Untuk mendeklarasikan objek yang ditujukkan oleh penunjuk sebagai const atau volatile, gunakan deklarasi formulir:

const char *cpch;
volatile char *vpch;

Untuk mendeklarasikan nilai penunjuk — yaitu, alamat aktual yang disimpan dalam pointer — sebagai const atau volatile, gunakan deklarasi formulir:

char * const pchc;
char * volatile pchv;

Bahasa C++ mencegah penugasan yang akan memungkinkan modifikasi objek atau pointer yang dinyatakan sebagai const. Penetapan tersebut akan menghapus informasi yang dinyatakan dengan objek atau penunjuk, sehingga melanggar niat deklarasi asli. Pertimbangkan deklarasi berikut:

const char cch = 'A';
char ch = 'B';

Mengingat deklarasi sebelumnya dari dua objek (cch, jenis karakter const, dan ch, dari jenis karakter), deklarasi/inisialisasi berikut valid:

const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;

Deklarasi/inisialisasi berikut salah.

char *pch2 = &cch;   // Error
char *const pch3 = &cch;   // Error

Deklarasi pch2 mendeklarasikan penunjuk di mana objek konstanta mungkin dimodifikasi dan oleh karena itu tidak diizinkan. Deklarasi pch3 menentukan bahwa penunjuk konstanta, bukan objek; deklarasi tidak diizinkan karena alasan pch2 yang sama deklarasi tidak diizinkan.

Delapan tugas berikut menunjukkan penetapan melalui penunjuk dan perubahan nilai penunjuk untuk deklarasi sebelumnya; untuk saat ini, asumsikan bahwa inisialisasi sudah benar melalui pch1 pch8.

*pch1 = 'A';  // Error: object declared const
pch1 = &ch;   // OK: pointer not declared const
*pch2 = 'A';  // OK: normal pointer
pch2 = &ch;   // OK: normal pointer
*pch3 = 'A';  // OK: object not declared const
pch3 = &ch;   // Error: pointer declared const
*pch4 = 'A';  // Error: object declared const
pch4 = &ch;   // Error: pointer declared const

Pointer dinyatakan sebagai volatile, atau sebagai campuran dan const volatile, patuhi aturan yang sama.

Penunjuk ke const objek sering digunakan dalam deklarasi fungsi sebagai berikut:

errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

Pernyataan sebelumnya mendeklarasikan fungsi, strcpy_s, di mana dua dari tiga argumen berjenis pointer ke char. Karena argumen diteruskan oleh referensi dan bukan berdasarkan nilai, fungsi akan bebas untuk memodifikasi keduanya strDestination dan strSource jika strSource tidak dideklarasikan sebagai const. Deklarasi strSource sebagai const meyakinkan pemanggil yang strSource tidak dapat diubah oleh fungsi yang disebut.

Catatan

Karena ada konversi standar dari typename * ke const typename *, legal untuk meneruskan argumen jenis char * ke strcpy_s. Namun, sebaliknya tidak benar; tidak ada konversi implisit untuk menghapus const atribut dari objek atau penunjuk.

const Penunjuk dari jenis tertentu dapat ditetapkan ke penunjuk dengan jenis yang sama. Namun, penunjuk yang tidak const dapat ditetapkan ke const penunjuk. Kode berikut menunjukkan penugasan yang benar dan salah:

// const_pointer.cpp
int *const cpObject = 0;
int *pObject;

int main() {
pObject = cpObject;
cpObject = pObject;   // C3892
}

Contoh berikut menunjukkan cara mendeklarasikan objek sebagai const jika Anda memiliki pointer ke penunjuk ke objek.

// const_pointer2.cpp
struct X {
   X(int i) : m_i(i) { }
   int m_i;
};

int main() {
   // correct
   const X cx(10);
   const X * pcx = &cx;
   const X ** ppcx = &pcx;

   // also correct
   X const cx2(20);
   X const * pcx2 = &cx2;
   X const ** ppcx2 = &pcx2;
}

Lihat juga

PointerPenunjuk Mentah