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* a
anlamına gelir a
bir 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, a
ve 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.