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
Lepaskan: 2025-01-03 14:36:39
asal
462 orang telah melayarinya

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 ;
}
Salin selepas log masuk

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;
Salin selepas log masuk

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;
Salin selepas log masuk

Satu Lagi Pemerhatian Menarik

Apabila pembolehubah ahli int, aksara dan rentetan diisytiharkan sebagai awam, output berubah sedikit:

  ... int    :  something 
  ... char   :   
  ... string :  something_2
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan