char const *p和const char *p是一个概念.
char * const p; p为指向字符变量的指针,地址不变,地址内容可变
const char *p; p为指向字符变量的指针,地址可变,地址内容不变
*在const前表示指针为常量,只能初始化,初始化后就不能再指向别的地址,但是可以改变指针指向的变量的值。
const在*前面,表示指针指向的值为常量,但是指针可以指向不同的变量。
程序1:
#include<iostream>
using namespace std;
char *str()
{
char *str="hejk ";
return str;
}
void main()
{
str();
}
程序2
#include<iostream>
using namespace std;
char *str()
{
char str[]="hejk ";
return str;
}
void main()
{
str();
}
为什么程序2会告警说返回巨变变量,而程序1不会。程序1中定义的str不也是局部变量吗?
char *str="hejk ";
建议写成:
const char *str="hejk ";
保存在静态存储区,返回后依然存在,所以没有警告。
而char str[]="hejk ";的空间是在栈上,return后,就消亡了,所以会警告。
char *str = "hejk ";
这样写,就相当于:
const char *str = "hejk ";
str指向的是常量字符串
存储在静态存储区。
如果你试图通过:
str[0] = 'a';
str[1] = 'b';
这样的代码去修改str所指向的字符串
就会出错。
我靠,都在胡说八道啊,这是什么论坛……
首先,数组和指针是不同的数据类型,有本质的区别:
char str[] = "hejk"; //sizeof(str) == 5 * sizeof(char)
char * str = "hejk"; //sizeof(str) == 4(x86) or 8(x64)
数组可以自动转型成指针,指针不能转成数组。
然后,字符串等价于字符数组,而不等于字符指针。根据上一条,字符串可以自动转型成字符指针。
再然后,"hejk"叫做“字符串字面量”,任何类型的字面量都是右值(没有名字的临时变量),必须让"hejk"成为左值(有名字的变量),才能够修改"hejk"这个字符串。
char str[] = "hejk";//等号两端是相同的数据类型,右值成为左值
char * str = "hejk";//等号两端是不同的数据类型,右端自动转型成char*,该char*得到了str的名字,而"hejk"这个char数组仍然没有名字
最后,"hejk"是局部字符数组,楼主的两个函数,在返回之后,"hejk"都将不复存在,而返回的值就是不复存在的数组的首地址,所以楼主的两个函数都是错误的,正确的是这样的:
char * str( )
{
static char str[] = "hejk";
return str;
}
静态局部数组被放在“全局变量区”,函数返回后,数组作为全局变量仍然存在。
.以上内容来自于csdn的帖子整理,虽然不见得全部正常,至少可以有所了解.