2013-03-29 14 views
6

Benconst char * ve kömür *

char *s = "Hello World!" ; 

salt okunur bellek ve işaretçi üzerinden değiştirilemez sabit dize depolanan anlıyoruz.

Bu nasıl Ayrıca 'dize' char * veya const char * türüdür

const char *s = "Hello World!"; 

farklıdır?

const char *s = "Hello World!"; 
s[0] = 'X'; // compile error 

Eğer const kullanmazsanız sorun, sonra: const char * olarak türünü vererek

+0

ilk kullanımdan kaldırıldı yolu ve tehlikeli yapabilir, char* dönüşümü kaldırıldı. – Beta

cevap

6

, bu Denersen derleyici bir hata verecektir çünkü yanlışlıkla hafıza üzerine yazmak zorlaştırır çalışma zamanına kadar yakalanmayabilir veya sadece programınızın yanlış bir şekilde yanlış olmasına neden olabilir.

+0

ah evet ben, char * s değiştirmeye çalıştığını, başarılı ancak const char * s derler görüyoruz değildir. Yani temelde const dizgiyi değiştirmemek için kırmızı bir bayrak kullanır. Güzel ! – dharag

8

fark ikincisi yasal ve eski olmadığıdır. Bu, C++ 11'de yapılan bir değişiklik. Formal olarak, "Hello World!", tip const char[13]; const char*'a dönüştürülebilir. Eski günlerde, onun tipi char* dönüştürülebilir olabilir char[13], olabilir. C++ const eklenerek dizi tipini değiştirilebilir, fakat char* dönüşümü tutulur böylece C++ çalışır, ancak işaretçi üretilen istenmeyen davranışlara işaret metni modifiye olur char* kullanılan mevcut C kodu. C++ 11 şimdi sadece yasal

const char *s = "Hello world!"; 
+0

'C++ 11 dönüştürmeyi char *' öğesine kaldırdı - gcc48 içinde değil. Bu gcc hatası mı? –

+0

@LeonidVolnitsky - C++ 11'de dönüşüme izin verilmez. Kural, derleyicinin "tanılama gerektirmez" ifadesini içeren bir kısıtlamanın ihlali için bir tanı koyması gerektiğidir. Bu yüzden ihtiyaç duyulan her şey bir uyarıdır, bu da bazen bir uyarıdır. ekleyerek 'const' olur' 'const veya değil türünü değiştirirse –

+0

' const 'daha mantıklı? –