1、stack(栈) 编译器自动分配内存(函数内部定义得局部变量、形参) 2、堆(Heap) 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收(new和delete) 3、Global\Static(全局区、静态区) 1、全局变量和静态变量的存储是放在一块儿的 2、可以简单认为:程序启动全局/静态变量就在此处、程序结束释放 4、Constant(常量区) 可以理解为所有常量都放在一起,该区域内容不可修改、 c++内存示例: 堆向高地址方向生长 栈向低地址方向生长 所以中间的空白区域会由两者共享,增大了内存的利用效率。 观察变量存放位置; 问题: 下面哪个语句可以接在const char* p = “Hello”;后面: 1、p[0]=‘A’ 2、p = “World”; 3、cin>>p 4、*(p+1)=‘e’
1和4共同的问题:表达式必须是可以修改的左值 运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。 ‘’A‘’是一个字符串常量,他一经定义系统就会分配一段地址给他(常量区)式子左边p[0]也是一个常量地址,所以不能用 = 将一个常量地址赋值给一个常量地址。这也就能回答问题:表达式必须是可修改的左值的答案,因为p[0]也是一个常量地址。 3、符号方向反了
关于1、4问题的详细解释看这篇文章: C语言中字符串赋值处理方式
char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值??双引号做了3件事: 1.申请了空间(在常量区),存放了字符串 2. 在字符串尾加上了’/0’ 3.返回地址 这里就是 返回的地址 赋值给了 p