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
396 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!

sumber:php.cn
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