(我预感我马上就会叛变C艹阵营辣!)
参考教材为《C++语言程序设计》 郑莉 董渊 何江洁 编
1)C++的内存分区。
- 栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除变量的存储区。里面的变量通常是局部变量、函数参数等。
- 堆:由new分配的内存块,由程序去控制释放 ,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
- 自由存储区:由malloc等分配的内存块,与堆类似,用free结束。
- 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,共同占用同一块内存区。
- 常量存储区:里面存放的是常量,不允许修改
2)#include<iostream> 编译器对程序进行预处理时,将文件iostream中的代码嵌入到程序中该指令所在的地方。
3)using namespace std; 将指定命名空间内的所有标识符暴露在当前的作用域内,使得在当前作用域中可以直接引用该命名空间内的任何标识符。而C++标准程序库的所有标识符都被声明在std命名空间内。(类似于Java中import package)
4)常量折叠: 在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间。


const表示我们自己的代码不会改变这个值(别的代码或者硬件有可能改变这个值)。volatile表示禁止优化。因为编译器会认为如果代码没有改变变量,那么这个变量就不会改变,因此编译器会用寄存器把该变量缓存起来,每次需要读取变量值的时候,就从缓存中读取。这在大多数时候是正确的,但是在多线程或者中断的场合就不正确了。
5)字符串与字符不同。字符串在内存中的存放形式是:
- “CHINA” = C H I N A \0
- “A” = A \0
- ‘A’ = A
6)
char str1[] = "abc"; char *str1 = "abc";
“abc”为字符串常量,当编译器初次遇到时,会将其内容存放在文字常量区(假设地址为addr)。
对于char str1[] = “abc”; 编译器会在栈上分配一定大小的空间,然后从addr处拷贝的内容到该数组,而char *str1 = “abc”; 则是在栈上为指针str1分配空间,并用addr来初始化str1。
所以char str1[]保存了文字常量的本地拷贝,而char *str1 只是指向了文字常量区。

“abc”在常量存储区中保存有一份(即使没保存,这样的操作也会新建一份),这里str5定义的时候,str5就可以直接指向”abc”所在的常量区的地址。
对于为什么 cout<<str5 显示abc,这是因为字符串常量的本质表现是代表它的第一个字符的地址。我们眼中的const char *str5 = “abc” ,在编译器眼中,”abc”实际上为第一个字母a在常量区的地址。同理,就可以明白为什么*str5输出的是a。即可以说明,str5和str6指向的都是常量区中a的地址,是同一个,所以输出为true。