Ini mungkin pertanyaan sederhana, tetapi mengapa const char * tidak memerlukan alamat memori untuk menunjuk?
Contoh:
const char* a = "Anthony";
dan tidak:
const char *a = // Address to const char
seperti jenis lainnya lakukan?
Ini mungkin pertanyaan sederhana, tetapi mengapa const char * tidak memerlukan alamat memori untuk menunjuk?
Contoh:
const char* a = "Anthony";
dan tidak:
const char *a = // Address to const char
seperti jenis lainnya lakukan?
Jawaban:
Anda bisa bayangkan deklarasi ini
const char* a = "Anthony";
cara berikut
const char string_literal[] = "Anthony";
const char *a = string_literal;
Yaitu kompiler membuat array karakter dengan durasi penyimpanan statis yang menyimpan string "Anthony"
dan alamat karakter pertama array (karena konversi implisit dari penunjuk array ke pointer ke karakter pertama mereka) ditugaskan ke pointer a
.
Berikut adalah program demonstratif yang menunjukkan bahwa literal string adalah array karakter.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
Output program adalah
The size of the referenced array is 8
Anthony
Ukuran string literal (dari array yang menyimpan string literal) sama dengan 8
karena string juga menyertakan karakter nol terminating ' \0'
.
Dalam program demonstratif ungkapan
std::extent<std::remove_reference<decltype( r )>::type>::value
dapat diganti hanya dengan ungkapan
sizeof( r )
mengapa const char tidak memerlukan alamat memori untuk menunjuk? *
Itu benar.
Seperti C-string literal
"Anthony"
adalah membusuk ke alamat yang 1 st karakter. Seperti, BTW; setiap array di C tidak.
const char[8]
(dalam C ++, mungkin char [8]
dalam C, tidak yakin) dan seperti semua array built-in, ketika menggunakannya sebagai nilai itu meluruh ke pointer ke elemen pertama.
char [8]
di C: c-faq.com/ansi/strlitnotconst.html
Itu memang membutuhkan alamat memori, dan MEMILIKI alamat memori. Dalam contoh Anda itu hanyalah alamat memori dari awal string. Itu sama dengan variabel array lainnya yang diinisialisasi pada waktu kompilasi, misalnya "int array [] = {0, 1, 2, 3};".
Jika Anda menggunakan editor biner untuk melihat executable, Anda akan melihat string "Anthony" di sana. Jika Anda meletakkan baris "printf (" a di% p \ n ", (void *) a);" di program Anda, lalu kompilasi & jalankan, Anda akan melihat alamatnya.
"Mengapa
const char*
tidak perlu pointer ke alamat memori?"
Bahkan, memang perlu alamat memori untuk menunjuk.
const char* a
berarti a
adalah penunjuk ke string literal atau konstanta karakter.
Pointer selalu memerlukan alamat untuk menunjuk karena itu adalah sifat pointer untuk menunjuk ke objek tertentu dalam memori. Jadi, a
dan pointer lainnya const char
juga.
String literal seperti "Hi My Name is Alfred!"
oleh penugasan seperti:
const char* a;
a = "Hi My Name is Alfred!";
meluruh ke pointer ke alamat elemen pertama dari string literal.
Berarti pada gilirannya, a
akan diberikan oleh alamat dari elemen pertama dari string literal "Hi My Name is Alfred!"
yang dapat disimpan di mana saja dalam memori tergantung pada lingkungan eksekusi.
Ini bukan dalam kekuatan seorang programmer di mana string literal persis disimpan. Tugas Anda hanya untuk menetapkan dan menangani masing-masing pointer dengan tepat.