Pertimbangkan coretan kod berikut:
class Address { int i ; char b; string c; public: void showMap ( void ) ; }; void Address :: showMap ( void ) { cout << "address of int :" << &i << endl ; cout << "address of char :" << &b << endl ; cout << "address of string :" << &c << endl ; }
Dijangkakan, output sepatutnya dipaparkan alamat pembolehubah ahli int, char dan rentetan. Walau bagaimanapun, alamat pembolehubah char b kekal kosong.
Keanehan ini timbul kerana << operator mentafsir &b sebagai rentetan gaya C dan bukannya alamat. Penunjuk char ditafsirkan sebagai urutan aksara yang ditamatkan nol oleh << operator.
Untuk menyelesaikan isu ini dan memaparkan alamat pembolehubah aksara, anda boleh menggunakan kod yang diubah suai berikut:
cout << "address of char :" << (void *) &b << endl;
Di sini, kami menggunakan Cast gaya C untuk menukar &b secara eksplisit kepada lompang *. Ini mengarahkan << operator untuk menganggapnya sebagai alamat dan bukannya urutan aksara. Alternatif yang lebih selamat ialah menggunakan static_cast:
cout << "address of char :" << static_cast<void *>(&b) << endl;
Apabila pembolehubah ahli int, aksara dan rentetan diisytiharkan sebagai awam, output berubah sedikit:
... int : something ... char : ... string : something_2
Di sini, sesuatu_2 sentiasa 8 kurang daripada sesuatu.
Perbezaan ini berlaku kerana pengkompil melapis pembolehubah ahli awam untuk menyelaraskannya secara optimum untuk akses memori. Dalam kes ini, pembolehubah aksara berkemungkinan berlapik kepada 8 bait, menghasilkan perbezaan 8 bait dalam alamat antara pembolehubah int dan rentetan.
Atas ialah kandungan terperinci Mengapa `cout` Tidak Memaparkan Alamat Pembolehubah Ahli `char` Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!