Pertanyaan Apa perbedaan antara const int *, const int * const, dan int const *?


Saya selalu mengacaukan cara menggunakan const int*, const int * const, dan int const * benar. Apakah ada seperangkat aturan yang mendefinisikan apa yang Anda bisa dan tidak bisa lakukan?

Saya ingin tahu semua yang harus dilakukan dan semua yang tidak boleh dilakukan dalam hal penugasan, meneruskan ke fungsi, dll.


992
2017-07-17 13:28


asal


Jawaban:


Baca mundur (seperti didorong oleh Searah Jarum Jam / Aturan Spiral):

  • int* - arahkan ke int
  • int const * - penunjuk ke const int
  • int * const - Pointer const ke int
  • int const * const - pointer const ke const int

Sekarang yang pertama const dapat berada di kedua sisi jenisnya jadi:

  • const int * == int const *
  • const int * const == int const * const

Jika Anda ingin benar-benar gila, Anda dapat melakukan hal-hal seperti ini:

  • int ** - penunjuk ke penunjuk ke int
  • int ** const - pointer const ke pointer ke int
  • int * const * - sebuah penunjuk ke pointer const ke int
  • int const ** - penunjuk ke penunjuk ke int const
  • int * const * const - sebuah pointer const ke pointer const ke int
  • ...

Dan untuk memastikan kita jelas tentang arti const

const int* foo;
int *const bar; //note, you actually need to set the pointer 
                //here because you can't change it later ;)

foo adalah penunjuk variabel ke bilangan bulat konstan. Ini memungkinkan Anda mengubah apa yang Anda tunjukkan tetapi bukan nilai yang Anda tunjukkan. Paling sering ini terlihat dengan string C-gaya di mana Anda memiliki pointer ke const char. Anda dapat mengubah string mana yang Anda tunjuk tetapi Anda tidak dapat mengubah isi string ini. Ini penting ketika string itu sendiri ada di segmen data program dan tidak boleh diubah.

bar adalah pointer konstan atau tetap ke nilai yang dapat diubah. Ini seperti referensi tanpa tambahan gula sintaksis. Karena fakta ini, biasanya Anda akan menggunakan referensi di mana Anda akan menggunakan T* const penunjuk kecuali Anda harus memperbolehkannya NULL petunjuk.


1740
2017-07-17 13:29



Bagi mereka yang tidak tahu tentang Clockwise / Spiral Rule: Mulai dari nama variabel, bergeraklah secara jamak (dalam hal ini, mundurlah) ke langkah berikutnya penunjuk atau mengetik. Ulangi hingga ekspresi berakhir.

di sini adalah demo:

pointer to int

const pointer to int const

pointer to int const

pointer to const int

const pointer to int


232
2017-07-10 02:15



Saya pikir semuanya sudah dijawab di sini, tapi saya hanya ingin menambahkan bahwa Anda harus berhati-hati typedefs! Mereka BUKAN hanya pengganti teks.

Sebagai contoh:

typedef char *ASTRING;
const ASTRING astring;

Tipe dari astring aku s char * consttidak const char *. Inilah salah satu alasan saya selalu cenderung untuk menempatkan const di sebelah kanan jenis, dan tidak pernah di awal.


123
2017-07-17 13:39



Seperti yang banyak orang tunjukkan:

Apa perbedaannya const X* p, X* const p dan const X* const p?

Anda harus membaca deklarasi pointer   kanan ke kiri.

  • const X* p berarti "p menunjuk ke X yang merupakan const": objek X tidak dapat diubah melalui p.

  • X* const p berarti "p adalah pointer const ke X yang non-const": Anda tidak dapat mengubah pointer p itu sendiri, tetapi Anda dapat mengubah objek X melalui p.

  • const X* const p berarti "p adalah pointer const ke X yang const": Anda tidak dapat mengubah pointer p itu sendiri, Anda juga tidak dapat mengubah objek X melalui p.


44
2017-07-17 13:36



  1. Referensi konstan:

    Referensi ke variabel (di sini int), yang konstan. Kami melewatkan variabel sebagai referensi terutama, karena referensi lebih kecil dalam ukuran daripada nilai sebenarnya, tetapi ada efek samping dan itu karena itu seperti alias ke variabel yang sebenarnya. Kami mungkin secara tidak sengaja mengubah variabel utama melalui akses penuh kami ke alias, jadi kami membuatnya konstan untuk mencegah efek samping ini.

    int var0 = 0;
    const int &ptr1 = var0;
    ptr1 = 8; // Error
    var0 = 6; // OK
    
  2. Petunjuk konstan

    Sekali pointer konstan menunjuk ke suatu variabel maka ia tidak dapat menunjuk ke variabel lain.

    int var1 = 1;
    int var2 = 0;
    
    int *const ptr2 = &var1;
    ptr2 = &var2; // Error
    
  3. Pointer ke konstan

    Pointer yang melaluinya seseorang tidak dapat mengubah nilai dari suatu variabel yang poinnya dikenal sebagai pointer ke konstan.

    int const * ptr3 = &var2;
    *ptr3 = 4; // Error
    
  4. Konstan pointer ke konstan

    Penunjuk konstan ke konstanta adalah penunjuk yang tidak dapat mengubah alamat yang menunjuk ke dan juga tidak dapat mengubah nilai yang disimpan di alamat tersebut.

    int var3 = 0;
    int var4 = 0;
    const int * const ptr4 = &var3;
    *ptr4 = 1;     // Error
     ptr4 = &var4; // Error
    

39
2018-05-17 20:21



Pertanyaan ini muncul tepat mengapa saya suka melakukan hal-hal seperti yang saya sebutkan dalam pertanyaan saya apakah const setelah id jenis diterima?

Singkatnya, saya menemukan cara termudah untuk mengingat aturan adalah "const" pergi setelah hal itu berlaku untuk. Jadi dalam pertanyaan Anda, "int const *" berarti bahwa int adalah konstan, sementara "int * const" akan berarti bahwa pointer itu konstan.

Jika seseorang memutuskan untuk meletakkannya di bagian paling depan (misalnya: "const int *"), sebagai pengecualian khusus dalam hal itu berlaku untuk hal setelahnya.

Banyak orang suka menggunakan pengecualian khusus karena mereka pikir itu terlihat lebih bagus. Saya tidak menyukainya, karena itu pengecualian, dan dengan demikian membingungkan hal-hal.


15
2017-07-17 13:52



Aturan umumnya adalah bahwa const kata kunci berlaku untuk apa yang mendahuluinya segera. Pengecualian, awal const berlaku untuk apa yang berikut.

  • const int* sama dengan int const* dan artinya "pointer ke int konstan".
  • const int* const sama dengan int const* const dan artinya "Penunjuk konstan ke int konstan".

Edit: Untuk Dos and Don'ts, if jawaban ini tidak cukup, bisakah kamu lebih tepat tentang apa yang kamu inginkan?


14
2017-07-17 13:30



Penggunaan Sederhana ‘const’

Penggunaan paling sederhana adalah mendeklarasikan konstanta bernama. Untuk melakukan ini, seseorang menyatakan konstanta seolah-olah variabel tetapi menambahkan 'const' sebelumnya. Seseorang harus segera menginisialinya dalam konstruktor karena, tentu saja, seseorang tidak dapat mengatur nilainya nanti karena itu akan mengubahnya. Sebagai contoh,

const int Constant1=96; 

akan membuat konstanta integer, yang tidak terbayangkan disebut 'Constant1', dengan nilai 96.

Konstanta seperti itu berguna untuk parameter yang digunakan dalam program tetapi tidak perlu diubah setelah program dikompilasi. Ini memiliki keuntungan untuk programmer atas perintah C preprocessor '#define' yang dipahami dan digunakan oleh kompilator itu sendiri, tidak hanya digantikan ke dalam teks program oleh preprocessor sebelum mencapai compiler utama, sehingga pesan kesalahan jauh lebih bermanfaat .

Ini juga bekerja dengan pointer tetapi kita harus berhati-hati di mana 'const' untuk menentukan apakah pointer atau apa yang menunjuk ke konstan atau keduanya. Sebagai contoh,

const int * Constant2 

menyatakan bahwa Constant2 adalah penunjuk variabel ke bilangan bulat konstan dan

int const * Constant2

adalah sintaks alternatif yang melakukan hal yang sama, sedangkan

int * const Constant3

menyatakan bahwa Constant3 adalah pointer konstan ke bilangan bulat variabel dan

int const * const Constant4

menyatakan bahwa Constant4 adalah pointer konstan ke bilangan bulat konstan. Pada dasarnya ‘const’ berlaku untuk apa pun yang ada di sebelah kiri kirinya (selain jika tidak ada apa pun di sana yang mana hal itu berlaku untuk apa pun haknya langsung).

ref: http://duramecho.com/ComputerInformation/WhyHowCppConst.html


12
2017-07-17 13:31