C++字符串常量如何区分
name="job";
char names[30]="make";
char *p=new char [20];
*p="andy";
char sex[15];
char *p=&sex;
等等...
该如何区分他们是不是字符串常量或变量?
为什么char name[20]; name="job";这样就是字符串常量?
char names[30]="make";这样就是字符串变量? 展开
一个由 C/C++编译的程序占用的内存分为以下几个部分 ,
1 、栈区( stack ) 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
2 、堆区( heap ) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表。
3 、全局区(静态区)( static )存放全局变量、静态数据、常量。程序结束后有系统释放
4 、文字常量区 常量字符串就是放在这里的。 程序结束后由系统释放。
5 、程序代码区 存放函数体(类成员函数和全局函数)的二进制代码。
如上所述,分析如下:
char name[20];
name="job"; // 这个赋值是错误的吧,name不是指针,不能这样赋值。
举例:
char name[20] = "job"; // name 是字符数组,也可以叫字符串变量
char *p = NULL; // p 是个字符指针,初始化NULL空指针
p = "andy"; // "andy" 是常量字符串,p 指向了这个常量字符串
设name在某函数内定义的,为局部变量,并已经分配了20字节的内存空间,在定义时给name[20] 初始化为“job”,“job”将依次填入name字符数组中,“job”被保存在了一个已经分配了的局部变量中,或者说保存在了栈区,所以 name 在这里是字符串变量;
类似的,指针p 也是局部变量,分配在栈区,但是分配的只是p 本身所需要的内存空间,用于存放p 所指向的内存的地址的,并没有为字符串分配内存空间,所以p = "andy"; 中的“andy” 是个常量字符串,被保存在了文字常量区。
常量字符串是对字符串而言的,表示这个字符串是常量,不可变。
除非你 用 const 修饰 char name[20] = "job"; 那么name就是字符串常量,否则name是变量。
再简单点说,就是程序中定义的已经分配了内存的用于保存字符串的变量是字符串变量;相对那些未分配内存的,直接出现的字符串,是常量字符串,保存在文字常量区,由指针指向。
const char[4].
在定义字符数组时可以采用特有的不同于一般数组初始化的方法:
char s[4] = "job" 这个等价于 char s[4] = {'j', 'o', 'b', '\0'};
所以你可以char s[4] = "job"(1), 也可以定义const char s[4] = "job"(2),这样字符数组就是一般的数组或者是const数组.
对于式子(1)的初始化其实用到了c++的一个转换,类似于const int i = 2, int k = i(const int的const被
自动忽略).
const char *p = "job",这个就是把数组自动转化为数组第一个元素的指针,这里const不能忽略(如果你的编译器是支持c++11标准的话,另外c和c++是两种语言,很多东西是不一致的).
const声明的也是变量,只是常变量罢了吧,只是不能改变值的意思。
为什么char names[30]="make";这样写的话 make就不是常量了?
而char name[20]; name="job"; 这样写,job就成常量了 为啥?
不是啊,“make”“job”本身是常量,然后用常量给变量赋值的可以理解吗?names是个变量。你不能认为names=“make”,这等号两边的就是一样了
推荐于2016-05-20 · 知道合伙人游戏行家
2、其操作方式类似于数据结构中的栈,堆区( heap ) 一般由程序员分配,字符串常量。现在来解释:字符串就是string类型定义的变量,如上s;字符串字面值就是双引号括起来的字符串。
char info[20];
info = "make";
cout f:\c\project2\project2\源.cpp(7): error C2440: “=”: 无法从“const char [5]”转换为“char [20]”