Rumah > pembangunan bahagian belakang > C++ > Mengapa Alamat Pembolehubah Char Tidak Dipaparkan dengan Betul dalam C?

Mengapa Alamat Pembolehubah Char Tidak Dipaparkan dengan Betul dalam C?

Mary-Kate Olsen
Lepaskan: 2025-01-03 19:02:43
asal
812 orang telah melayarinya

Why Doesn't the Address of a Char Variable Display Correctly in C  ?

Mengapa Alamat Data Char Tidak Dipaparkan?

Pertimbangkan kod ini:

class Address {
public:
    int i;
    char b;
    string c;
    
    void showMap();
};

void Address::showMap() {
    cout << "address of int    : " << &i << endl;
    cout << "address of char   : " << &b << endl;
    cout << "address of string : " << &c << endl;
}
Salin selepas log masuk

Apabila menjalankan kod ini , anda mungkin perasan bahawa alamat pembolehubah char 'b' tidak dipaparkan dalam output. Sebaliknya, anda melihat kawasan kosong. Mengapa ini berlaku?

Puncanya terletak pada cara alamat-pengendali (&) berfungsi dengan jenis data yang berbeza. Apabila digunakan pada pembolehubah char, &b, anda memperoleh penunjuk char, iaitu, char *.

Secara lalai, operator output << mentafsir char* ini sebagai rentetan gaya C dan cuba mencetak jujukan aksara. Walau bagaimanapun, dalam kes ini, kami hanya mahu memaparkan alamat pembolehubah char, bukan nilainya.

Untuk menyelesaikan isu ini, anda boleh menggunakan pendekatan berikut:

cout << "address of char   : " << (void *) &b << endl;
Salin selepas log masuk

Di sini , kami menghantar alamat b ke void * sebelum menggunakannya dengan operator output. Ini memastikan bahawa pengendali menganggapnya sebagai penunjuk kepada lokasi memori, bukan urutan aksara.

Mengapa Perbezaan Antara Alamat 8?

Jika anda membuat pembolehubah ahli 'int', 'char', dan 'rentetan' awam, anda mungkin melihat satu lagi tingkah laku yang menarik. Perbezaan antara alamat 'int' dan 'rentetan' adalah secara konsisten 8. Ini kerana:

  • Penjajaran lalai untuk int pada kebanyakan seni bina ialah 4 bait.
  • Lalai lalai penjajaran untuk char ialah 1 bait.
  • Penjajaran lalai untuk rentetan ialah 4 bait.

Apabila pengkompil memperuntukkan memori untuk ahli kelas, ia melakukannya dengan cara yang menjajarkan mereka dengan sempadan masing-masing. Dalam kes ini, pembolehubah char 'b' mengambil satu bait, meninggalkan 3 bait ruang yang tidak digunakan. Ruang ini kemudiannya diikuti oleh pembolehubah rentetan 'c', yang menjajarkan dengan sempadan 4-bait yang terdekat.

Hasilnya, perbezaan antara alamat '&c' dan '&b' ialah 1 ( untuk 'b') 3 (untuk ruang yang tidak digunakan) 4 (untuk penjajaran 4-bait bagi 'c') = 8.

Atas ialah kandungan terperinci Mengapa Alamat Pembolehubah Char Tidak Dipaparkan dengan Betul dalam C?. 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