說(shuō)明
使用char[]
和char*
定義變量,并賦值字符串常量,這兩者有較大區(qū)別。前者定義數(shù)組,并將字符串常量拷貝至該數(shù)組,變量表示這個(gè)新數(shù)組的首地址。后者定義指針,指向一個(gè)字符常量。前者會(huì)產(chǎn)生新的字符串?dāng)?shù)據(jù),并且擁有讀寫權(quán)限,后者不一定產(chǎn)生新字符串?dāng)?shù)據(jù),并且只有讀權(quán)限。
實(shí)驗(yàn)代碼
/**
* @file char_array_pointer.cpp
* @brief 測(cè)試字符數(shù)組和指針
* @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;
}
運(yùn)行及結(jié)果
$ 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@