Rumah >pembangunan bahagian belakang >C++ >Mengapa `cout` Tidak Memaparkan Alamat Pembolehubah Ahli `char` Dengan Betul?

Mengapa `cout` Tidak Memaparkan Alamat Pembolehubah Ahli `char` Dengan Betul?

Barbara Streisand
Barbara Streisandasal
2025-01-03 14:36:39396semak imbas

Why Doesn't `cout` Display the Address of a `char` Member Variable Correctly?

Mengapa Alamat Data Char Tidak Dipaparkan?

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.

Sebab

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.

Penyelesaian

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;

Satu Lagi Pemerhatian Menarik

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn