C++字符串常量如何区分

charname[20];name="job";charnames[30]="make";char*p=newchar[20];*p="andy";charsex[15]... char name[20];
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";这样就是字符串变量?
展开
 我来答
qin0301
推荐于2016-07-24 · TA获得超过114个赞
知道答主
回答量:30
采纳率:100%
帮助的人:37.8万
展开全部

一个由 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是变量。

    

    再简单点说,就是程序中定义的已经分配了内存的用于保存字符串的变量是字符串变量;相对那些未分配内存的,直接出现的字符串,是常量字符串,保存在文字常量区,由指针指向。

花开伤落
2014-08-21 · TA获得超过118个赞
知道小有建树答主
回答量:90
采纳率:0%
帮助的人:101万
展开全部
在c++中“job”类似的称为字符串字面量(string literal),它的类型是const字符数组,在本例中为:
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++是两种语言,很多东西是不一致的).
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柜子里的小怪兽
2014-08-21
知道答主
回答量:21
采纳率:0%
帮助的人:2.4万
展开全部
不是的啊,这样的声明方式的话都是字符串变量的,就算是你写的第一种,name本身也是一个变量,可以再赋值的。字符串常量应该是“job”本身吧,然后你用它去给变量name赋值的。

const声明的也是变量,只是常变量罢了吧,只是不能改变值的意思。
更多追问追答
追问
为什么char names[30]="make";这样写的话 make就不是常量了?
而char name[20]; name="job"; 这样写,job就成常量了 为啥?
追答
不是啊,“make”“job”本身是常量,然后用常量给变量赋值的可以理解吗?names是个变量。你不能认为names=“make”,这等号两边的就是一样了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
成语迷宫
推荐于2016-05-20 · 知道合伙人游戏行家
成语迷宫
知道合伙人游戏行家
采纳数:1702 获赞数:9023
毕业于山东农业大学,学士。从事游戏软件开发5年,涉猎广泛,熟悉诸多游戏技巧。现任公司研发顾问。

向TA提问 私信TA
展开全部
1、C++编译的程序占用的内存分为以下几个部分,栈区( stack ) 由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等;
2、其操作方式类似于数据结构中的栈,堆区( heap ) 一般由程序员分配,字符串常量。现在来解释:字符串就是string类型定义的变量,如上s;字符串字面值就是双引号括起来的字符串。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
只想简单__
2014-08-21
知道答主
回答量:4
采纳率:0%
帮助的人:5206
展开全部
是么? 不是用const修饰后才是常量么? 搞糊涂了
追问
  char info[20];
info = "make";
cout f:\c\project2\project2\源.cpp(7): error C2440: “=”: 无法从“const char [5]”转换为“char [20]”
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式