Arasındaki fark nedir
char* name
sabit dize değişmezine işaret eder ve
const char* name
Arasındaki fark nedir
char* name
sabit dize değişmezine işaret eder ve
const char* name
Yanıtlar:
char*
Bir olan değişken bir işaretçi değişken karakter / dizesi.
const char*
Bir olan değişken bir işaretçi değişmez karakter / dizesi. Bu işaretçinin işaret ettiği konumların içeriğini değiştiremezsiniz. Ayrıca, derleyicilerin bunu yapmaya çalıştığınızda hata iletileri vermeleri gerekir. Aynı nedenle, gelen dönüşüm const char *
To char*
kullanımdan kaldırıldı.
char* const
Bir olduğu değişmez işaretçi (diğer herhangi bir konuma işaret olamaz) , ancak bu noktalar olan konumun içeriği değişebilir .
const char* const
Bir olan değişmez bir işaretçi değişmez karakter / dizesi.
char const *
char *
çalışırken segmentasyon hatası vermeyecek mi?
const
ben unuttum ve sağ, yanlışlıkla verileri değişti eğer derleyici hata vermek isterseniz?
char *name
Hangi name
noktayı ve hangi noktayı gösterdiğini değiştirebilirsiniz .
const char* name
Karakteri hangi name
noktalara çevirebilirsiniz, fakat işaret ettiği karakteri değiştiremezsiniz.
düzeltme: Sen işaretçi değiştirebilirsiniz, ancak değil karakter hangi name
işaret ( https://msdn.microsoft.com/en-us/library/vstudio/whkd4k6a(v=vs.100).aspx , bkz "Örnekler" ). Bu durumda, const
belirteç char
yıldız işareti için geçerli değildir.
MSDN sayfa ve göre http://en.cppreference.com/w/cpp/language/declarations , const
önce *
ederken, decl-belirteci dizisinin bir parçası olan const
sonra *
Bildiricisi bir parçasıdır.
Bir bildirim belirteci dizisi nedenle birden fazla declarators, takip edilebilir const char * c1, c2
beyan c1
olarak const char *
ve c2
şekilde const char
.
DÜZENLE:
Yorumlardan, sorunuz işaretçi bir dize değişmezine işaret ettiğinde iki bildirim arasındaki farkı soruyor gibi görünüyor.
Bu durumda, olmamalı hangi kömürü değiştirmek name
o yol açabilir gibi noktalarda Tanımsız Davranış . Dize değişmezleri salt okunur bellek bölgelerine tahsis edilebilir (uygulama tanımlı) ve bir kullanıcı programı bunu hiçbir şekilde değiştirmemelidir. Bunu yapmaya yönelik herhangi bir girişim Tanımsız Davranış ile sonuçlanır.
Bu durumda (dize değişmez değerleri ile kullanım) tek fark, ikinci bildirimin size küçük bir avantaj sağlamasıdır. Derleyiciler, ikinci durumda dize hazır bilgisini değiştirmeye çalışırsanız genellikle size bir uyarı verir.
#include <string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[] = "Sample string";
strcpy(str1,source); //No warning or error, just Undefined Behavior
strcpy(str2,source); //Compiler issues a warning
return 0;
}
Çıktı:
cc1: uyarılar hata olarak değerlendiriliyor
prog.c: 'main' işlevinde:
prog.c: 9: hata: 'strcpy' öğesinin 1 argümanını iletme niteleyicileri işaretçi hedef türünden atar
Derleyici ikinci durum için uyarır, ancak ilk durum için uyarmaz.
name
ya case.It noktaları UB neden olabilir.
char mystring[101] = "My sample string";
const char * constcharp = mystring; // (1)
char const * charconstp = mystring; // (2) the same as (1)
char * const charpconst = mystring; // (3)
constcharp++; // ok
charconstp++; // ok
charpconst++; // compile error
constcharp[3] = '\0'; // compile error
charconstp[3] = '\0'; // compile error
charpconst[3] = '\0'; // ok
// String literals
char * lcharp = "My string literal";
const char * lconstcharp = "My string literal";
lcharp[0] = 'X'; // Segmentation fault (crash) during run-time
lconstcharp[0] = 'X'; // compile error
// *not* a string literal
const char astr[101] = "My mutable string";
astr[0] = 'X'; // compile error
((char*)astr)[0] = 'X'; // ok
char *
Bir dizgi değişmezini (salt okunur bellekte bulunur) değiştirmeye çalıştığımızdan , değeri değiştirmenin segmentasyon hatası verdiğini belirtmek gerekir
Her iki durumda da, bir dize değişmezinin işaretçisinin char *
veyaconst char *
.
Ancak fark, işaretçi ise, işaretçi const char *
değerini değiştirmeye çalışırsanız derleyici bir tanı vermelidir, ancak işaretçi ise değiştirmez char *
.
extern ... name
ve sahip olabilir *name = 'X';
. 'Uygun işletim sisteminde', bu başarısız olabilir, ancak gömülü sistemlerde, platform / derleyiciye özgü bir şey yapmasını beklerdim.
DAVA 1:
char *str = "Hello";
str[0] = 'M' //Warning may be issued by compiler, and will cause segmentation fault upon running the programme
Yukarıdaki ayarlar, programın ikili görüntüsünde sabit olarak kodlanmış ve bellekte salt okunur olarak işaretlenen "Hello" değişmez değerine işaret etmek için, bu String değişmezindeki herhangi bir değişikliğin geçersiz olduğu ve segmentasyon hataları oluşturacağı anlamına gelir.
DURUM 2:
const char *str = "Hello";
str[0] = 'M' //Compile time error
DURUM 3:
char str[] = "Hello";
str[0] = 'M'; // legal and change the str = "Mello".
İlk olarak gerçekten değiştirebiliyorsanız, ikinci olarak değiştiremezsiniz. Hakkında kadar okuyun const
(fark hakkında bazı güzel kılavuzları var) doğruluğu. Ayrıca char const * name
onu yeniden işaretleyemeyeceğiniz yer de var.
Soru, arasındaki fark nedir
char *name
sabit dize değişmezine işaret eder ve
const char *cname
Verildi
char *name = "foo";
ve
const char *cname = "foo";
2 arasında çok fazla fark yoktur ve her ikisi de doğru olarak görülebilir. Nedeniyle C kodunun uzun mirasına, dize hazır bir tür oldu char[]
değil, const char[]
ve aynı şekilde kabul ettiklerini eski kod sürü char *
yerineconst char *
onlar argümanları değiştirmek olmadığında bile.
Genel olarak 2 temel fark olduğunu *cname
veya cname[n]
Çeşidi Sol taraf değerlendirecek const char
ise, *name
ya da name[n]
Çeşidi Sol taraf değerlendirecek char
olan, değiştirilebilir Sol taraf . Atamanın hedefi değiştirilebilir bir değer değilse, bir tanılama mesajı üretmek için uygun bir derleyici gerekir ; aşağıdaki değerlere tahsis konusunda herhangi bir uyarı oluşturmasına gerek yoktur char
:
name[0] = 'x'; // no diagnostics *needed*
cname[0] = 'x'; // a conforming compiler *must* produce a diagnostics message
Her iki durumda da derleyicinin derlemeyi durdurması gerekmez ; görevlendirme için bir uyarı oluşturması yeterlidir cname[0]
. Ortaya çıkan program doğru bir program değil . Yapının davranışı tanımlanmamıştır . Çökebilir veya daha da kötüsü çökmeyebilir ve bellekteki dize değişmezini değiştirebilir.
Aslında, char* name
bir sabitin göstergesi değil, bir değişkenin göstergesi. Bu başka sorudan bahsediyor olabilirsiniz.