簡體   English   中英

const char與char數組vs std :: string的指針

[英]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 * s1char 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";

s1s2可以很好地指向存儲器中的相同地址,而s3s4是相同字符串的兩個不同副本,並且駐留在存儲器的不同區域中。

如果您正在編寫C ++,請使用std::string除非您絕對需要一個字符數組。 如果需要可修改的字符數組,請使用char s[] 如果您只需要一個不可變的字符串,請使用const char*

哪一個使用取決於您的要求。 指針為您提供更多靈活性。 在某些情況下,有毒。 字符串是一種安全的選擇,它們提供Iterator支持。

除非你知道為什么需要一個char數組/指向char的指針,否則使用std::string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM