Bu basit bir soru olabilir, ancak bir const char * işaret etmek için neden bir bellek adresine ihtiyaç duymaz?
Misal:
const char* a = "Anthony";
ve yok:
const char *a = // Address to const char
diğer tipler gibi?
Bu basit bir soru olabilir, ancak bir const char * işaret etmek için neden bir bellek adresine ihtiyaç duymaz?
Misal:
const char* a = "Anthony";
ve yok:
const char *a = // Address to const char
diğer tipler gibi?
Yanıtlar:
Bu beyanı hayal edebilirsiniz
const char* a = "Anthony";
aşağıdaki yol
const char string_literal[] = "Anthony";
const char *a = string_literal;
Yani derleyici, dizeyi saklayan statik depolama süresine sahip bir dizi karakter oluşturur ve dizinin "Anthony"ilk karakterinin adresini (dizi belirleyicilerinin işaretçileri ilk karakterlerine örtük olarak dönüştürmesi nedeniyle) işaretçiye atanır a.
Dize değişmezlerinin karakter dizileri olduğunu gösteren örnek bir program.
#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;
}
Program çıktısı
The size of the referenced array is 8
Anthony
Dize değişmezinin (dize değişmezini saklayan dizinin) boyutu eşittir, 8çünkü dize ayrıca sonlanan sıfır karakterini içerir '\0' .
Gösterici programda ifade
std::extent<std::remove_reference<decltype( r )>::type>::value
sadece ifade yerine kullanılabilir
sizeof( r )
Bir const char neden işaret etmek için bir bellek adresine ihtiyaç duymuyor? *
Öyle.
C-string değişmez
"Anthony"
onun 1 adresine çürümüş olan st karakteri. BTW gibi; C'deki herhangi bir dizi yapar.
const char[8](C ++ 'da char [8], C'de olabilir , emin değilim) ve tüm yerleşik diziler gibi, değer olarak kullanıldığında ilk öğesinin işaretçisine bozulur.
char [8]C dilinde
Bir bellek adresine ihtiyaç duyar ve bir bellek adresine sahiptir. Örneğinizde, dizenin başlangıcının bellek adresidir. Derleme zamanında başlatılan diğer herhangi bir dizi değişkeni ile aynıdır, örneğin "int dizi [] = {0, 1, 2, 3};".
Yürütülebilir dosyaya bakmak için bir ikili düzenleyici kullandıysanız, orada "Anthony" dizesini görürsünüz. "Printf (" a% p \ n ", (void *) a);" programınızda, derleyin ve çalıştırın, adresi göreceksiniz.
"Neden
const char*bir bellek adresinin göstergesine gerek yok?"
Aslında, O does işaret edecek bir bellek adresi lazım.
const char* aanlamına gelir abir dizgi değişmezi veya karakter sabitine bir işaretçi.
İşaretçi her zaman işaret etmesi gereken bir adres gerektirir, çünkü bellekteki belirli bir nesneyi işaret eden işaretçinin doğasıdır. Yani, ave diğer işaretçi içinconst char yapar.
"Hi My Name is Alfred!"Ödev gibi bir dize hazır bilgisi :
const char* a;
a = "Hi My Name is Alfred!";
dize değişmezinin ilk öğesinin adresinin göstergesine bozunur.
Sırayla anlamına gelir, a"Hi My Name is Alfred!" yürütme ortamına bağlı olarak bellekte herhangi bir yerde saklanabilen dize hazır bilgisinin ilk öğesinin adresi tarafından atanır .
Bir dizgi hazır bilgisinin tam olarak depolandığı bir programcının kudretinde değildir. Ödeviniz yalnızca ilgili işaretçiyi uygun şekilde atamak ve işlemek içindir.