const char*用于定义一个指向常量字符串的指针,通常形式为:
const char* ptr = "hello";
但可能很多粗心的朋友们没有注意到下面一种定义:
const char* ptr2 = "hello";
ptr和ptr2指向的是同一片内存,即定义const char* ptr = "hello"并不等于创建新的常量字符串,而是试图返回一个常量字符串的访问地址,如果常量字符串不存在就创建常量字符串并返回常量字符串的地址,这种说法并不全对。
const char*是一个指针,和常量字符串的获取和创建没有关系,访问和创建常量字符串是"hello"完成的,没错啦,是通过"hello"访问的常量字符串"hello",你随时随地可以通过"hello"获取指向"hello"的指针,"hello"在第一次被使用到的时候被创建,以后使用"hello"都是访问这块地址。
比如下面的例子:
static const char *
change_to_string(int change)
{
change &= (EV_CHANGE_ADD|EV_CHANGE_DEL);
if (change == EV_CHANGE_ADD) {
return "add";
} else if (change == EV_CHANGE_DEL) {
return "del";
} else if (change == 0) {
return "none";
} else {
return "???";
}
}
通过return的方式返回字符串常量,可以代替某些函数的static变量,很酷吧。
g++的bug
g++在处理常量字符串类型的返回值时存在bug,上面例子返回的是const char*,也是众所周知的安全访问字符串常量方式,但你也可以定义返回值类型为char*,是的,你可以定义为char*,并用一个char*的指针来接收它,突破了不能将const char*赋值给char*的限制,你做到了,你的码危险了,你修改常量字符串的时候就core了。
这个bug你值得尝试,却不必拥有。