[英]Pointer to const char vs char array vs std::string
在這里,我有兩行代碼
const char * s1 = "test";
char s2 [] = "test";
兩行代碼具有相同的行為,所以我看不出是否應該優先選擇s1
不是s2
,反之亦然。 除了s1和s2之外,還有使用std::string
。 我認為使用std :: string的方式是最優雅的。 在查看其他代碼時,我經常看到人們use const char *
或char s []
。 因此,我現在的問題是,何時應該使用const char * s1
或char s []
或std::string
? 有什么區別,我應該在哪種情況下使用哪種方法?
POINTERS
--------
char const* s1 = "test"; // pointer to string literal - do not modify!
char* s1 = "test"; // pointer to string literal - do not modify!
// (conversion to non-const deprecated in C++03 and
// disallowed in C++11)
ARRAYS
------
char s1[5] = "test"; // mutable character array copied from string literal
// - do what you like with it!
char s1[] = "test"; // as above, but with size deduced from initialisation
CLASS-TYPE OBJECTS
------------------
std::string s1 = "test"; // C++ string object with data copied from string
// literal - almost always what you *really* want
const char * s1 = "test";
char s2 [] = "test";
這兩者並不完全相同。 s1
是不可變的:它指向恆定的內存。 修改字符串文字是未定義的行為。
是的,在C ++中你應該更喜歡std::string
。
第一個是常數,第二個不是。 std :: string是一個類類型,它為字符串操作實現了許多有用的函數和方法,使其更容易和用戶友好。 帶有char指針的c風格“字符串”很難控制,操作並經常導致錯誤,但是沒有std :: string的開銷。 通常最好堅持使用std :: strings,因為它們更容易維護。
你應該關心的兩者之間的唯一區別是:
您的項目已經使用了哪一個?
這兩個沒有相同的行為。 s1
是一個簡單的指針,它被初始化為指向存儲器的某個(通常是只讀的)區域。 另一方面, s2
定義了一個大小為5的本地數組,並用該字符串的副本填充它。
在形式上,您不能修改s1
,即執行類似s1[0] = 'a'
。 特別是,在奇怪的情況下,它可能會導致程序中的所有其他"test"
成為"aest"
,因為它們都共享相同的內存。 這就是現代編譯器在你寫作時大喊大叫的原因
char* s = "test";
另一方面,允許修改s2
,因為它是本地副本。
換句話說,在以下示例中,
const char* s1 = "test";
const char* s2 = "test";
char s3[] = "test";
char s4[] = "test";
s1
和s2
可以很好地指向存儲器中的相同地址,而s3
和s4
是相同字符串的兩個不同副本,並且駐留在存儲器的不同區域中。
如果您正在編寫C ++,請使用std::string
除非您絕對需要一個字符數組。 如果需要可修改的字符數組,請使用char s[]
。 如果您只需要一個不可變的字符串,請使用const char*
。
哪一個使用取決於您的要求。 指針為您提供更多靈活性。 在某些情況下,有毒。 字符串是一種安全的選擇,它們提供Iterator支持。
除非你知道為什么需要一個char數組/指向char的指針,否則使用std::string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.