Saya menjalankan beberapa program contoh untuk membiasakan diri dengan C ++ dan saya mengalami pertanyaan berikut. Pertama, berikut ini contoh kode:
void print_string(const char * the_string)
{
cout << the_string << endl;
}
int main () {
print_string("What's up?");
}
Pada kode di atas, parameter ke print_string bisa saja const char * const the_string
. Mana yang lebih tepat untuk ini?
Saya memahami bahwa perbedaannya adalah bahwa yang satu adalah penunjuk ke karakter konstan, sedangkan yang lainnya adalah penunjuk konstan ke karakter konstan. Tapi mengapa keduanya berhasil? Kapan itu relevan?
const char *
jauh lebih baik karenaconst
berada di sisi yang berlawanan.Pointer yang bisa diubah ke karakter yang bisa berubah
Pointer yang dapat diubah ke karakter konstan
Penunjuk konstan ke karakter yang bisa berubah
Penunjuk konstan ke karakter konstan
sumber
const char* p; --> constant pointer to mutable character
danchar *const p; --> mutable pointer to constant character
const char * p
sebagai: "p adalah penunjuk ke konstanta karakter" atau penunjuk yang dapat berubah ke karakter konstan seperti yang dinyatakan James dengan benar. sama dengan yang kedua :).const char * const
berarti penunjuk serta data yang ditunjuk penunjuk, keduanya adalah const!const char *
hanya berarti data yang ditunjuk penunjuk, adalah const. Namun pointer itu sendiri bukanlah const.Contoh.
sumber
(Saya tahu ini sudah tua tetapi saya tetap ingin berbagi.)
Hanya ingin menguraikan jawaban Thomas Matthews. Deklarasi Tipe C Right-Left Rule cukup banyak mengatakan: saat membaca deklarasi tipe C mulai dari pengenal dan ke kanan saat Anda bisa dan pergi saat Anda tidak bisa.
Ini paling baik dijelaskan dengan beberapa contoh:
Contoh 1
Mulai dari pengenal, kita tidak bisa ke kanan jadi kita ke kiri
foo adalah sebuah konstanta ...
Lanjutkan ke kiri
foo adalah penunjuk konstan ke ...
Lanjutkan ke kiri
foo adalah pointer konstan untuk char di ...
Lanjutkan ke kiri
foo adalah penunjuk konstan ke konstanta char (Lengkap!)
Contoh 2
Mulai dari pengenal, kita tidak bisa ke kanan jadi kita ke kiri
foo adalah sebuah konstanta ...
Lanjutkan ke kiri
foo adalah penunjuk konstan ke ...
Lanjutkan ke kiri
foo adalah penunjuk konstan ke char (Selesai!)
Contoh 1337
Mulailah dari pengenal, tapi sekarang kita bisa melakukannya dengan benar!
foo adalah array 8 ...
Tekan tanda kurung jadi tidak bisa ke kanan lagi, ke kiri
foo adalah larik 8 penunjuk ke ...
Selesai di dalam kurung, sekarang bisa ke kanan
foo adalah larik 8 penunjuk ke fungsi yang mengembalikan ...
Tidak lebih ke kanan, ke kiri
foo adalah larik 8 penunjuk ke fungsi yang mengembalikan satu penunjuk ke ...
Lanjutkan ke kiri
foo adalah larik berisi 8 penunjuk ke fungsi yang mengembalikan satu penunjuk ke a konstanta ...
Lanjutkan ke kiri
foo adalah larik yang terdiri dari 8 penunjuk ke fungsi yang mengembalikan satu penunjuk ke konstanta penunjuk ke ...
Lanjutkan ke kiri
foo adalah larik yang terdiri dari 8 penunjuk ke fungsi yang mengembalikan satu penunjuk ke penunjuk konstan ke a Char ...
Lanjutkan ke kiri
foo adalah larik berisi 8 penunjuk ke fungsi yang mengembalikan satu penunjuk ke penunjuk konstan ke karakter konstanta (Lengkap!)
Penjelasan lebih lanjut: http://www.unixwiz.net/techtips/reading-cdecl.html
sumber
Banyak orang menyarankan membaca penentu tipe dari kanan ke kiri.
Dalam kedua bentuk, penunjuk menunjuk ke data konstan atau hanya-baca.
Dalam bentuk kedua, penunjuk tidak dapat diubah; penunjuk akan selalu menunjuk ke tempat yang sama.
sumber
Perbedaannya adalah bahwa tanpa tambahan
const
programmer dapat mengubah, di dalam metode, di mana pointer menunjuk ke; sebagai contoh:Itu malah ilegal jika tanda tangan itu
void print_string(const char * const the_string)
Banyak programmer merasa terlalu bertele-tele (dalam kebanyakan skenario)
const
kata kunci tambahan dan mengabaikannya, meskipun secara semantik kata itu benar.sumber
Yang terakhir, Anda menjamin untuk tidak mengubah penunjuk dan karakter terlebih dahulu, Anda hanya menjamin bahwa isinya tidak akan berubah tetapi Anda dapat memindahkan penunjuk.
sumber
Tidak ada alasan mengapa salah satu tidak berhasil. Yang
print_string()
dilakukan hanyalah mencetak nilainya. Itu tidak mencoba untuk memodifikasinya.Sebaiknya buat fungsi yang tidak mengubah argumen mark sebagai const. Keuntungannya adalah variabel yang tidak dapat diubah (atau Anda tidak ingin diubah) dapat diteruskan ke fungsi ini tanpa kesalahan.
Sejauh sintaks yang tepat, Anda ingin menunjukkan tipe argumen mana yang "aman" untuk diteruskan ke fungsi.
sumber
Saya pikir ini jarang berbeda relevan, karena fungsi Anda tidak dipanggil dengan argumen seperti & * the_string atau ** the_string. Pointer itu sendiri adalah argumen tipe-nilai, jadi meskipun Anda memodifikasinya, Anda tidak akan mengubah salinan yang digunakan untuk memanggil fungsi Anda. Versi yang Anda tunjukkan memastikan bahwa string tidak akan berubah, dan saya pikir itu cukup dalam kasus ini.
sumber
const char *
berarti Anda tidak dapat menggunakan penunjuk untuk mengubah apa yang diarahkan. Anda dapat mengubah penunjuk untuk menunjuk ke sesuatu yang lain.Mempertimbangkan:
Parameternya adalah penunjuk non-const ke char const, sehingga dapat diubah ke
const char *
nilai lain (seperti string konstan). Namun, jika kami salah menulis*text = '\0'
maka kami akan mendapatkan kesalahan kompilasi.Bisa dibilang, jika Anda tidak berniat mengubah tujuan parameter, Anda bisa membuat parameter
const char * const text
, tetapi tidak umum melakukannya. Kami biasanya mengizinkan fungsi untuk mengubah nilai yang diteruskan ke parameter (karena kami melewatkan parameter dengan nilai, setiap perubahan tidak mempengaruhi pemanggil).BTW: Ini adalah praktik yang baik untuk dihindari
char const *
karena sering salah dibaca - artinya sama denganconst char *
, tetapi terlalu banyak orang yang membacanya sebagai maknachar * const
.sumber
const char *
dan tanda tanganchar const *
- cara Anda mengucapkan BTW sangat membantu!Hampir semua jawaban lain benar, tetapi salah satu aspeknya terlewat: Saat Anda menggunakan ekstra
const
pada parameter dalam deklarasi fungsi, compiler pada dasarnya akan mengabaikannya. Untuk sesaat, mari kita abaikan kompleksitas contoh Anda sebagai penunjuk dan cukup gunakanint
.mendeklarasikan fungsi yang sama seperti
Hanya dalam definisi fungsinya adalah ekstra
const
bermakna:Definisi ini kompatibel dengan salah satu deklarasi di atas. Penelepon tidak peduli bahwa
x
adalahconst
-yang 's detail implementasi yang tidak relevan di situs panggilan.Jika Anda memiliki
const
penunjuk keconst
data, aturan yang sama berlaku:Beberapa programmer C ++ repot-repot membuat parameter
const
, bahkan ketika mereka bisa, terlepas dari apakah parameter tersebut adalah pointer.sumber
const
ke parameter fungsi Anda dalam definisi tetapi bukan deklarasi.Perbedaan di antara keduanya adalah bahwa char * dapat mengarah ke sembarang penunjuk. Sebaliknya, karakter konstanta * menunjuk ke konstanta yang ditentukan di bagian DATA yang dapat dieksekusi. Dan, dengan demikian, Anda tidak dapat mengubah nilai karakter dari string * char *.
sumber
const char*
dapat menunjukkan kemana saja yang diinginkan.