2016-03-22 22 views
0

Aşağıdaki iki program beni gerçekten karıştırıyor. İlk programda const char* kullanıyorum ve dizeyi yeniden atayabilirim. İkinci örnekte bir const char[] kullanıyorum ve şimdi dizeyi yeniden atayamıyorum. Birisi bunun neden olduğunu açıklayabilir mi?char in char ve pointer dizisi C++

İkinci
#include <iostream> 
using namespace std; 

const char* x {"one"}; 
void callthis(const char t[]); 

int main() 
{ 
    callthis("two"); 

    return 0; 
} 
void callthis(const char t[]){ 

    t=x;  // OK 

    // OR 

// x=t; // OK 
} 

:

#include <iostream> 
using namespace std; 

const char x[] {"three"}; 
void callthis(const char* t); 

int main(){ 
    callthis("four"); 

    return 0; 
} 

void callthis(const char* t){ 
    x=t; // error: assignment of read-only variable 'x'; 
    // error : incompatible types in assignment of 
    // 'const char*' to 'const char [6]' 
} 

cevap

4

bir dizi gösterici değildir. Bir dizinin bir tanıtıcısı

Diziler bir işaret değil. Bu zamanda başlatılmadığı bildirilirse, dizinin değerini belirlemenin tek yolu her bir öğeye yineleme yapmak ve içeriğini ayarlamaktır. İlk örnek çalışır

error: array type 'char [6]' is not assignable

nedenle işaretçileri atanabilir olmasıdır: Biz Hala gibi bir hata alacağı

char x[] {"three"}; 
//... 
void callthis(const char* t){ 
    x=t; 
} 

kullanmak olsaydı dizisinde const, kırmızı işitme olduğunu ve bir const char * sabit bir işaretçi değil, sabit bir char işaretçisidir. İşaretçi const olmadığı için işaretçinin işaret ettiği noktaları değiştirebilir. Eğer

const char * const x {"one"}; 

kullanmak için olsaydı Sonra Ben de size kodunda using namespace std; kullandığınızı fark

error: cannot assign to variable 'x' with const-qualified type 'const char *const'

çizgisinde bir hata aldık. Küçük örneklerde, gerçekten hiçbir şeye zarar vermez, ancak onu kullanma alışkanlığına girmelisiniz. Neden hakkında daha fazla bilgi için bkz: Why is “using namespace std” in C++ considered bad practice?