Hal pertama di sebelah kiri "const" adalah apa yang konstan. Jika "const" adalah benda yang paling jauh ke kiri, maka hal pertama di sebelah kanannya adalah apa yang konstan.
Cupcake
4
Sebagai tip ramah, jangan pernah lupa bahwa cdecl adalah suatu hal.
Braden Best
Ada lagi char const * yang merupakan tipe pengembalian exception :: what ()
Zhang
Jawaban:
363
Perbedaannya adalah bahwa itu const char *adalah pointer ke const char, sedangkan char * constadalah pointer konstan ke a char.
Yang pertama, nilai yang ditunjuk tidak bisa diubah tetapi pointer bisa. Yang kedua, nilai yang ditunjukkan bisa berubah tetapi pointer tidak bisa (mirip dengan referensi).
Ada juga a
constchar*const
yang merupakan pointer konstan ke char konstan (jadi tidak ada yang bisa diubah).
catatan:
Dua bentuk berikut ini setara:
constchar*
dan
charconst*
Alasan yang tepat untuk ini dijelaskan dalam standar C ++, tetapi penting untuk mencatat dan menghindari kebingungan. Saya tahu beberapa standar pengkodean yang lebih suka:
charconst
lebih
constchar
(dengan atau tanpa pointer) sehingga penempatan constelemen sama dengan pointer const.
Apakah bermanfaat untuk mencatat apa yang terjadi jika beberapa variabel ditentukan dalam deklarasi yang sama? Saya percaya const int *foo,*bar;akan mendeklarasikan keduanya foodan barmenjadi int const *, tetapi int const *foo, *barakan menyatakan foosebagai int const *dan barmenjadi int *. Saya pikir typedef int * intptr; const intptr foo,bar;akan mendeklarasikan kedua variabel menjadi int * const; Saya tidak tahu cara menggunakan deklarasi gabungan untuk membuat dua variabel dari tipe itu tanpa typedef.
supercat
1
@supercat I believe const int *foo,*bar; would declare both foo and bar to be int const *: Ya. but int const *foo, *bar would declare foo to be a int const * and bar to be int *: Tidak! Ini akan sama persis dengan kasus sebelumnya. (Lihat ideone.com/RsaB7n di mana Anda mendapatkan kesalahan yang sama untuk foo dan bar). I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const: Iya. I don't know any way to use a combined declaration to create two variables of that type without a typedef: Nah, int *const foo, *const bar;. C deklarator sintaks ...
gx_
@ gx_: Jadi saya salah - ketidakpastian saya adalah mengapa saya menyarankan bahwa mungkin membantu untuk mengatakan apa aturannya. Apa yang akan int const *foo, *volatile bardilakukan bar? Buat keduanya constdan volatile? Saya rindu pemisahan bersih Pascal dari nama variabel yang dideklarasikan dan tipe mereka (pointer ke array pointer ke integer adalah var foo: ^Array[3..4] of ^Integer; `. Itu akan menjadi beberapa hal bersarang lucu bersarang di C, saya pikir.
supercat
3
@supercat (oh, C-hanya, maaf untuk link kode C ++, saya tiba di sini dari C ++ pertanyaan) Ini semua tentang sintaks C deklarasi , dengan ( "murni") jenis bagian diikuti oleh deklarator . Di int const *foo, *volatile barbagian tipe " " adalah int const(berhenti sebelum *) dan deklaratornya adalah *foo(ekspresi *fooakan menunjukkan suatu int const) dan *volatile bar; membaca kanan-ke-kiri (aturan yang baik untuk cv-kualifikasi ), fooadalah pointer ke sebuah const int, dan barmerupakan pointer yang mudah menguap ke sebuah const int (pointer itu sendiri tidak stabil, int menunjuk [diakses sebagai] const).
gx_
@supercat Dan sebagai untuk "pointer ke array dari pointer ke bilangan bulat" (Saya tidak tahu Pascal, tidak yakin tentang [3..4]sintaks, jadi mari kita array 10 elemen): int *(*foo)[10];. Ini mencerminkan penggunaannya (masa depan) sebagai ekspresi: *(*foo)[i](dengan ibilangan bulat dalam rentang [0, 10)yaitu [0, 9]) pertama akan dereferensi foountuk mendapatkan di array, kemudian mengakses elemen pada indeks i(karena postfix []mengikat lebih ketat daripada awalan *), kemudian dereferensi elemen ini, akhirnya menghasilkan int(lihat ideone.com/jgjIjR ). Tetapi typedefmembuatnya lebih mudah (lihat ideone.com/O3wb7d ).
gx_
102
Untuk menghindari kebingungan, selalu tambahkan kualifikasi const.
Mengapa? "Menghindari kebingungan" tidak menjelaskan apa yang membingungkan saya.
Andrew Weir
14
@ Andrew: Saya mengisyaratkan konsistensi dan karena itu mudah dibaca. Menulis semua jenis kualifikasi sehingga mereka memodifikasi apa yang ada di sebelah kiri mereka, selalu , itulah yang saya gunakan.
diapir
1
Sebenarnya ini adalah jawaban terbaik untuk masalah yang saya temukan di SO
Trap
8
Sebagai standar kode, saya jarang menemukan gaya ini dan karenanya saya tidak akan mengadopsinya. Namun sebagai alat pembelajaran, jawaban ini sangat membantu! (Jadi saya kira sayang sekali ini bukan gaya yang lebih umum.)
natevw
8
@Alla: ptidak berhubungan dengan jenis: (const int *const). Untuk lebih baik atau lebih buruk (lebih buruk jika Anda bertanya kepada saya) kualifikasi const, baik dalam C dan C ++, dimaksudkan sebagai postfix: cf const member function void foo(int a) const;. Kemungkinan untuk mendeklarasikan const intadalah pengecualian daripada aturan.
diapir
44
const selalu memodifikasi hal yang datang sebelum itu (di sebelah kiri itu), KECUALI ketika itu adalah hal pertama dalam deklarasi tipe, di mana ia memodifikasi hal yang datang setelah itu (di sebelah kanannya).
Jadi keduanya sama:
intconst*i1;constint*i2;
mereka mendefinisikan pointer ke a const int. Anda dapat mengubah tempat i1dan i2titik, tetapi Anda tidak dapat mengubah nilai yang mereka tunjukkan.
Ini:
int*const i3 =(int*)0x12345678;
mendefinisikan constpointer ke integer dan menginisialisasi untuk menunjuk di lokasi memori 12345678. Anda dapat mengubah intnilai di alamat 12345678, tetapi Anda tidak dapat mengubah alamat yang i3menunjuk ke.
const * charkode C tidak valid dan tidak berarti. Mungkin Anda bermaksud menanyakan perbedaan antara a const char *dan a char const *, atau mungkin perbedaan antara a const char *dan a char * const?
const char*adalah pointer ke karakter konstan char* constadalah pointer konstan ke karakter const char* constadalah pointer konstan ke karakter konstan
Berarti " foomenunjuk ( *) ke intyang tidak dapat mengubah ( const)".
Untuk programmer ini berarti "Saya tidak akan mengubah nilai apa yang foomenunjuk ke".
*foo = 123;atau foo[0] = 123;tidak valid.
foo = &bar; Diperbolehkan.
int *const foo;
Berarti " footidak dapat mengubah ( const) dan menunjuk ( *) ke sebuah int".
Untuk programmer ini berarti "Saya tidak akan mengubah alamat memori yang foomerujuk".
*foo = 123;atau foo[0] = 123;diizinkan.
foo = &bar; akan menjadi tidak valid.
const int *const foo;
Berarti " footidak dapat mengubah ( const) dan menunjuk ( *) ke intyang tidak dapat mengubah ( const)".
Bagi programmer, ini berarti "Saya tidak akan mengubah nilai dari foopoin apa , atau mengubah alamat yang foomerujuk".
const char * x Di sini X pada dasarnya adalah penunjuk karakter yang menunjuk ke nilai konstan
char * const x merujuk ke penunjuk karakter yang konstan, tetapi lokasi yang ditunjuknya dapat berubah.
const char * const x adalah kombinasi ke 1 dan 2, berarti itu adalah penunjuk karakter konstan yang menunjuk ke nilai konstan.
const * char x akan menyebabkan kesalahan kompiler. itu tidak bisa dinyatakan.
char const * x sama dengan poin 1.
aturan praktisnya adalah jika const adalah dengan nama var maka pointer akan konstan tetapi lokasi menunjuk dapat diubah , jika pointer akan menunjuk ke lokasi konstan dan pointer dapat menunjuk ke lokasi lain tetapi konten lokasi yang menunjuk tidak dapat diubah .
"char * const x merujuk ke penunjuk karakter yang konstan, tetapi lokasi yang ditunjuknya dapat berubah." Salah. Nilai di lokasi dapat diubah bukan lokasi itu sendiri.
PleaseHelp
3
Yang pertama adalah kesalahan sintaksis. Mungkin maksud Anda perbedaannya
constchar* mychar
dan
char*const mychar
Dalam hal itu, yang pertama adalah pointer ke data yang tidak bisa berubah, dan yang kedua adalah pointer yang akan selalu menunjuk ke alamat yang sama.
Banyak jawaban memberikan teknik khusus, aturan praktis dll untuk memahami contoh khusus dari deklarasi variabel ini. Tetapi ada teknik umum untuk memahami pernyataan apa pun:
Sesuai aturan jarum jam / spiral aadalah penunjuk ke karakter yang konstan. Yang berarti karakter konstan tetapi pointer dapat berubah. yaitu a = "other string";baik-baik saja tetapi a[2] = 'c';akan gagal dikompilasi
B)
char*const a;
Sesuai aturan, aadalah pointer pointer ke karakter. yaitu Anda dapat melakukan a[2] = 'c';tetapi Anda tidak bisa melakukannyaa = "other string";
(Akan jauh lebih baik jika esensi jawabannya tidak akan disembunyikan di balik tautan, dengan teks di sini bahkan tidak mengutip, atau setidaknya merujuk, ke salah satu spesifiknya, di luar generik "sesuai aturan".)
Sz.
@Sz. Apakah Anda memiliki kebingungan khusus di sini yang dapat saya hapus? Sebenarnya tidak banyak yang diketahui setelah mengetahui aturannya.
PnotNP
1
Saya kira maksudmu const char * dan char * const.
Yang pertama, const char *, adalah penunjuk ke karakter konstan. Pointer itu sendiri bisa berubah.
Yang kedua, char * const adalah pointer konstan ke karakter. Pointer tidak dapat berubah, karakter yang ditunjukkannya bisa.
Dan kemudian ada const char * const di mana pointer dan karakter tidak dapat berubah.
Dua pertama sebenarnya sama dan ketiga adalah kesalahan kompilator :)
workmad3
1
Berikut adalah penjelasan terperinci dengan kode
/*const char * p;
char * const p;
const char * const p;*/// these are the three conditions,// const char *p;const char * const p; pointer value cannot be changed// char * const p; pointer address cannot be changed// const char * const p; both cannot be changed.#include<stdio.h>/*int main()
{
const char * p; // value cannot be changed
char z;
//*p = 'c'; // this will not work
p = &z;
printf(" %c\n",*p);
return 0;
}*//*int main()
{
char * const p; // address cannot be changed
char z;
*p = 'c';
//p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*//*int main()
{
const char * const p; // both address and value cannot be changed
char z;
*p = 'c'; // this will not work
p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*/
// Some more complex constant variable/pointer declaration.// Observing cases when we get error and warning would help// understanding it better.int main(void){char ca1[10]="aaaa";// char array 1char ca2[10]="bbbb";// char array 2char*pca1= ca1;char*pca2= ca2;charconst*ccs= pca1;char*const csc= pca2;
ccs[1]='m';// Bad - error: assignment of read-only location ‘*(ccs + 1u)’
ccs= csc;// Good
csc[1]='n';// Good
csc= ccs;// Bad - error: assignment of read-only variable ‘csc’charconst**ccss=&ccs;// Goodcharconst**ccss1=&csc;// Bad - warning: initialization from incompatible pointer typechar*const*cscs=&csc;// Goodchar*const*cscs1=&ccs;// Bad - warning: initialization from incompatible pointer typechar**const cssc=&pca1;// Goodchar**const cssc1=&ccs;// Bad - warning: initialization from incompatible pointer typechar**const cssc2=&csc;// Bad - warning: initialization discards ‘const’// qualifier from pointer target type*ccss[1]='x';// Bad - error: assignment of read-only location ‘**(ccss + 8u)’*ccss= ccs;// Good*ccss= csc;// Good
ccss= ccss1;// Good
ccss= cscs;// Bad - warning: assignment from incompatible pointer type*cscs[1]='y';// Good*cscs= ccs;// Bad - error: assignment of read-only location ‘*cscs’*cscs= csc;// Bad - error: assignment of read-only location ‘*cscs’
cscs= cscs1;// Good
cscs= cssc;// Good*cssc[1]='z';// Good*cssc= ccs;// Bad - warning: assignment discards ‘const’// qualifier from pointer target type*cssc= csc;// Good*cssc= pca2;// Good
cssc= ccss;// Bad - error: assignment of read-only variable ‘cssc’
cssc= cscs;// Bad - error: assignment of read-only variable ‘cssc’
cssc= cssc1;// Bad - error: assignment of read-only variable ‘cssc’}
Pointer konstan : Pointer konstan dapat menunjuk hanya ke variabel tunggal dari masing-masing tipe data selama seluruh program. Kita dapat mengubah nilai variabel yang ditunjuk oleh pointer. Inisialisasi harus dilakukan selama waktu deklarasi itu sendiri.
Sintaksis:
datatype *const var;
char *const datang dalam kasus ini.
/*program to illustrate the behaviour of constant pointer */#include<stdio.h>int main(){int a=10;int*const ptr=&a;*ptr=100;/* we can change the value of object but we cannot point it to another variable.suppose another variable int b=20; and ptr=&b; gives you error*/
printf("%d",*ptr);return0;}
Pointer ke nilai const : Dalam pointer ini dapat menunjukkan sejumlah variabel dari masing-masing jenis tetapi kita tidak dapat mengubah nilai objek yang ditunjuk oleh pointer pada waktu tertentu.
Sintaksis:
const datatype *varatau datatype const *var
const char* datang dalam kasus ini.
/* program to illustrate the behavior of pointer to a constant*/#include<stdio.h>int main(){int a=10,b=20;intconst*ptr=&a;
printf("%d\n",*ptr);/* *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/
ptr=&b;
printf("%d",*ptr);/*we can point it to another object*/return0;}
The constpengubah diterapkan untuk jangka segera ke kiri nya. Satu-satunya pengecualian untuk ini adalah ketika tidak ada yang di sebelah kirinya, maka itu berlaku untuk apa yang ada di sebelah kanannya.
Ini semua adalah cara yang setara untuk mengatakan "pointer konstan ke konstanta char":
Apakah ini tergantung pada kompiler? gcc menghasilkan untuk "const char const *" dan "const const char *" dan "char const const *" hasil yang sama -> pointer dapat menunjuk ke lokasi lain.
cosinus0
1
Dua aturan
If const is between char and *, it will affect the left one.
If const is not between char and *, it will affect the nearest one.
misalnya
char const *. This is a pointer points to a constant char.
char * const. This is a constant pointer points to a char.
Saya ingin menunjukkan bahwa menggunakan int const *(atau const int *) bukan tentang pointer yang menunjuk ke suatu const intvariabel, tetapi bahwa variabel ini adalah constuntuk pointer spesifik ini.
Sebagai contoh:
int var =10;intconst* _p =&var;
Kode di atas mengkompilasi dengan sangat baik. _pmenunjuk ke suatu constvariabel, meskipun varitu sendiri tidak konstan.
Jawaban:
Perbedaannya adalah bahwa itu
const char *
adalah pointer keconst char
, sedangkanchar * const
adalah pointer konstan ke achar
.Yang pertama, nilai yang ditunjuk tidak bisa diubah tetapi pointer bisa. Yang kedua, nilai yang ditunjukkan bisa berubah tetapi pointer tidak bisa (mirip dengan referensi).
Ada juga a
yang merupakan pointer konstan ke char konstan (jadi tidak ada yang bisa diubah).
catatan:
Dua bentuk berikut ini setara:
dan
Alasan yang tepat untuk ini dijelaskan dalam standar C ++, tetapi penting untuk mencatat dan menghindari kebingungan. Saya tahu beberapa standar pengkodean yang lebih suka:
lebih
(dengan atau tanpa pointer) sehingga penempatan
const
elemen sama dengan pointerconst
.sumber
const int *foo,*bar;
akan mendeklarasikan keduanyafoo
danbar
menjadiint const *
, tetapiint const *foo, *bar
akan menyatakanfoo
sebagaiint const *
danbar
menjadiint *
. Saya pikirtypedef int * intptr; const intptr foo,bar;
akan mendeklarasikan kedua variabel menjadiint * const
; Saya tidak tahu cara menggunakan deklarasi gabungan untuk membuat dua variabel dari tipe itu tanpa typedef.I believe const int *foo,*bar; would declare both foo and bar to be int const *
: Ya.but int const *foo, *bar would declare foo to be a int const * and bar to be int *
: Tidak! Ini akan sama persis dengan kasus sebelumnya. (Lihat ideone.com/RsaB7n di mana Anda mendapatkan kesalahan yang sama untuk foo dan bar).I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const
: Iya.I don't know any way to use a combined declaration to create two variables of that type without a typedef
: Nah,int *const foo, *const bar;
. C deklarator sintaks ...int const *foo, *volatile bar
dilakukanbar
? Buat keduanyaconst
danvolatile
? Saya rindu pemisahan bersih Pascal dari nama variabel yang dideklarasikan dan tipe mereka (pointer ke array pointer ke integer adalahvar foo: ^Array[3..4] of ^Integer
; `. Itu akan menjadi beberapa hal bersarang lucu bersarang di C, saya pikir.int const *foo, *volatile bar
bagian tipe " " adalahint const
(berhenti sebelum*
) dan deklaratornya adalah*foo
(ekspresi*foo
akan menunjukkan suatuint const
) dan*volatile bar
; membaca kanan-ke-kiri (aturan yang baik untuk cv-kualifikasi ),foo
adalah pointer ke sebuah const int, danbar
merupakan pointer yang mudah menguap ke sebuah const int (pointer itu sendiri tidak stabil, int menunjuk [diakses sebagai] const).[3..4]
sintaks, jadi mari kita array 10 elemen):int *(*foo)[10];
. Ini mencerminkan penggunaannya (masa depan) sebagai ekspresi:*(*foo)[i]
(dengani
bilangan bulat dalam rentang[0, 10)
yaitu[0, 9]
) pertama akan dereferensifoo
untuk mendapatkan di array, kemudian mengakses elemen pada indeksi
(karena postfix[]
mengikat lebih ketat daripada awalan*
), kemudian dereferensi elemen ini, akhirnya menghasilkanint
(lihat ideone.com/jgjIjR ). Tetapitypedef
membuatnya lebih mudah (lihat ideone.com/O3wb7d ).Untuk menghindari kebingungan, selalu tambahkan kualifikasi const.
sumber
p
tidak berhubungan dengan jenis:(const int *const)
. Untuk lebih baik atau lebih buruk (lebih buruk jika Anda bertanya kepada saya) kualifikasi const, baik dalam C dan C ++, dimaksudkan sebagai postfix: cf const member functionvoid foo(int a) const;
. Kemungkinan untuk mendeklarasikanconst int
adalah pengecualian daripada aturan.const
selalu memodifikasi hal yang datang sebelum itu (di sebelah kiri itu), KECUALI ketika itu adalah hal pertama dalam deklarasi tipe, di mana ia memodifikasi hal yang datang setelah itu (di sebelah kanannya).Jadi keduanya sama:
mereka mendefinisikan pointer ke a
const int
. Anda dapat mengubah tempati1
dani2
titik, tetapi Anda tidak dapat mengubah nilai yang mereka tunjukkan.Ini:
mendefinisikan
const
pointer ke integer dan menginisialisasi untuk menunjuk di lokasi memori 12345678. Anda dapat mengubahint
nilai di alamat 12345678, tetapi Anda tidak dapat mengubah alamat yangi3
menunjuk ke.sumber
const * char
kode C tidak valid dan tidak berarti. Mungkin Anda bermaksud menanyakan perbedaan antara aconst char *
dan achar const *
, atau mungkin perbedaan antara aconst char *
dan achar * const
?Lihat juga:
sumber
const char*
adalah pointer ke karakter konstanchar* const
adalah pointer konstan ke karakterconst char* const
adalah pointer konstan ke karakter konstansumber
Rule of thumb: baca definisi dari kanan ke kiri!
const int *foo;
Berarti "
foo
menunjuk (*
) keint
yang tidak dapat mengubah (const
)".Untuk programmer ini berarti "Saya tidak akan mengubah nilai apa yang
foo
menunjuk ke".*foo = 123;
ataufoo[0] = 123;
tidak valid.foo = &bar;
Diperbolehkan.int *const foo;
Berarti "
foo
tidak dapat mengubah (const
) dan menunjuk (*
) ke sebuahint
".Untuk programmer ini berarti "Saya tidak akan mengubah alamat memori yang
foo
merujuk".*foo = 123;
ataufoo[0] = 123;
diizinkan.foo = &bar;
akan menjadi tidak valid.const int *const foo;
Berarti "
foo
tidak dapat mengubah (const
) dan menunjuk (*
) keint
yang tidak dapat mengubah (const
)".Bagi programmer, ini berarti "Saya tidak akan mengubah nilai dari
foo
poin apa , atau mengubah alamat yangfoo
merujuk".*foo = 123;
ataufoo[0] = 123;
tidak valid.foo = &bar;
akan menjadi tidak valid.sumber
const char * x Di sini X pada dasarnya adalah penunjuk karakter yang menunjuk ke nilai konstan
char * const x merujuk ke penunjuk karakter yang konstan, tetapi lokasi yang ditunjuknya dapat berubah.
const char * const x adalah kombinasi ke 1 dan 2, berarti itu adalah penunjuk karakter konstan yang menunjuk ke nilai konstan.
const * char x akan menyebabkan kesalahan kompiler. itu tidak bisa dinyatakan.
char const * x sama dengan poin 1.
aturan praktisnya adalah jika const adalah dengan nama var maka pointer akan konstan tetapi lokasi menunjuk dapat diubah , jika pointer akan menunjuk ke lokasi konstan dan pointer dapat menunjuk ke lokasi lain tetapi konten lokasi yang menunjuk tidak dapat diubah .
sumber
Yang pertama adalah kesalahan sintaksis. Mungkin maksud Anda perbedaannya
dan
Dalam hal itu, yang pertama adalah pointer ke data yang tidak bisa berubah, dan yang kedua adalah pointer yang akan selalu menunjuk ke alamat yang sama.
sumber
Aturan praktis lainnya adalah untuk mengecek letak const :
sumber
Banyak jawaban memberikan teknik khusus, aturan praktis dll untuk memahami contoh khusus dari deklarasi variabel ini. Tetapi ada teknik umum untuk memahami pernyataan apa pun:
SEBUAH)
Sesuai aturan jarum jam / spiral
a
adalah penunjuk ke karakter yang konstan. Yang berarti karakter konstan tetapi pointer dapat berubah. yaitua = "other string";
baik-baik saja tetapia[2] = 'c';
akan gagal dikompilasiB)
Sesuai aturan,
a
adalah pointer pointer ke karakter. yaitu Anda dapat melakukana[2] = 'c';
tetapi Anda tidak bisa melakukannyaa = "other string";
sumber
Saya kira maksudmu const char * dan char * const.
Yang pertama, const char *, adalah penunjuk ke karakter konstan. Pointer itu sendiri bisa berubah.
Yang kedua, char * const adalah pointer konstan ke karakter. Pointer tidak dapat berubah, karakter yang ditunjukkannya bisa.
Dan kemudian ada const char * const di mana pointer dan karakter tidak dapat berubah.
sumber
Berikut adalah penjelasan terperinci dengan kode
sumber
sumber
Sintaksis:
char *const
datang dalam kasus ini.Sintaksis:
const datatype *var
ataudatatype const *var
const char*
datang dalam kasus ini.sumber
char * const dan const char *?
const char * p;
// nilai tidak bisa diubahchar * const p;
// alamat tidak bisa diubahconst char * const p;
// keduanya tidak bisa diubah.sumber
The
const
pengubah diterapkan untuk jangka segera ke kiri nya. Satu-satunya pengecualian untuk ini adalah ketika tidak ada yang di sebelah kirinya, maka itu berlaku untuk apa yang ada di sebelah kanannya.Ini semua adalah cara yang setara untuk mengatakan "pointer konstan ke konstanta
char
":const char * const
const char const *
char const * const
char const const *
sumber
Dua aturan
If const is between char and *, it will affect the left one.
If const is not between char and *, it will affect the nearest one.
misalnya
char const *. This is a pointer points to a constant char.
char * const. This is a constant pointer points to a char.
sumber
Saya ingin menunjukkan bahwa menggunakan
int const *
(atauconst int *
) bukan tentang pointer yang menunjuk ke suatuconst int
variabel, tetapi bahwa variabel ini adalahconst
untuk pointer spesifik ini.Sebagai contoh:
Kode di atas mengkompilasi dengan sangat baik.
_p
menunjuk ke suatuconst
variabel, meskipunvar
itu sendiri tidak konstan.sumber
Saya ingat dari buku Czech tentang C: baca deklarasi yang Anda mulai dengan variabel dan ke kiri. Sehingga untuk
Anda dapat membaca sebagai: "
a
adalah variabel tipe pointer konstan kechar
",Anda dapat membaca sebagai: "
a
adalah pointer ke variabel konstan tipe char. Saya harap ini membantu.Bonus:
Anda akan membaca seperti
a
pointer konstan ke variabel konstan tipe char.sumber