Mengapa const char * tidak memerlukan pointer ke alamat memori?

18

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?

Weidelix
sumber
8
Apa yang membuat Anda berpikir string literal tidak memiliki alamat memori?
user207421
2
Sepakat. Saya tidak akan mengharapkan siapa pun yang mengajukan pertanyaan ini untuk mengetahui kategori nilai ada, apalagi mereka memiliki nama.
user4581301
13
Harap jangan ajukan pertanyaan yang ditandai dengan C dan C ++. Seperti yang dapat kita amati, jawabannya sekarang spesifik C ++ dan komentar menggagalkan lagi tentang perbedaan antara kedua bahasa. Ada begitu banyak perbedaan sekarang sehingga sulit untuk mengajukan pertanyaan yang sebenarnya memiliki jawaban valid yang sama untuk kedua bahasa. Tentukan bahasa yang ingin Anda gunakan sebelum bertanya, silakan.
larkey

Jawaban:

26

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 8karena 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 )
Vlad dari Moskow
sumber
5

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.

alk
sumber
Lebih khusus, itu bertipe 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.
Nikos C.
@NikosC .: Terima kasih telah mengingatkan saya pada kata kerja sihir paling penting dalam konteks ini! ;)
alk
Terima kasih atas jawabannya! Saya bertanya-tanya dari mana itu mendapatkan memori.
Weidelix
1
Tidak dapat berbicara untuk C, tapi saya cukup yakin bahwa C ++ tidak menentukan di mana literal sengatan harus disimpan. Baru saja menggali. Jika ada aturan, itu terkubur di suatu tempat yang aneh dan jauh dari penyebutan "string literal".
user4581301
2
@NikosC. char [8]di C: c-faq.com/ansi/strlitnotconst.html
David Ranieri
1

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.

jamesqf
sumber
0

"Mengapa const char*tidak perlu pointer ke alamat memori?"

Bahkan, memang perlu alamat memori untuk menunjuk.

const char* aberarti aadalah 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, adan pointer lainnya const charjuga.

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, aakan 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.

RobertS mendukung Monica Cellio
sumber