說明
使用char[]和char*定義變量,并賦值字符串常量,這兩者有較大區別。前者定義數組,并將字符串常量拷貝至該數組,變量表示這個新數組的首地址。后者定義指針,指向一個字符常量。前者會產生新的字符串數據,并且擁有讀寫權限,后者不一定產生新字符串數據,并且只有讀權限。
實驗代碼
/** * @file char_array_pointer.cpp * @brief 測試字符數組和指針 * @copyrigh public domain */#include <iostream>const char* string0() {const char* str = "string";return str;}const char* string1() {return "string";}const char* string2() {static const char str[] = "string";return str;}const char* string3() { char str[] = "string"; return str;}void function() { char a[] = "abc123456";}void test_string1() { const char* str = string1(); std::cout << "test_string1: " << str << std::endl; function(); std::cout << "test_string1: " << str << std::endl;}void test_string2() { const char* str = string2(); std::cout << "test_string2: " << str << std::endl; function(); std::cout << "test_string2: " << str << std::endl;}void test_string3() { const char* str = string3(); std::cout << "test_string3: " << str << std::endl; function(); std::cout << "test_string3: " << str << std::endl;}int main() {std::cout << "string0 == string1 is " << (string0() == string1() ? "true" : "false") << std::endl;std::cout << "string1 == string2 is " << (string1() == string2() ? "true" : "false") << std::endl; test_string1(); test_string2(); test_string3(); return 0;}
運行及結果
$ g++ char_array_pointer.cpp
char_array_pointer.cpp: In function 'const char* string3()':
char_array_pointer.cpp:24:10: warning: address of local variable 'str' returned [enabled by default]
$ ./a.exe
string0 == string1 is true
string1 == string2 is false
test_string1: string
test_string1: string
test_string2: string
test_string2: string
test_string3: string
test_string3: abc12345YP@