2012-05-14
Chapter01
1、构建一个C++程序过程:预处理→编译→链接
预处理:交由预处理器处理的指令以#开头
预编译器指令 |
功能 |
常见用途 |
#include [file] |
将指定的文件代码插入到指令所在位置 |
包含头文件 |
#define key value |
指定key的每次出现都替换为value |
在C中定义常量或宏 C++中有更好的方法 |
#ifdef [key] #ifndef [key] #endif |
有条件的包含或者忽略ifdef ifndef块中的代码 |
避免循环包含,即避免代码被多次包含 |
#pragma |
不同的编译器不一样 |
尽量不用 |
编译:翻译为机器可读的对象文件
链接:单个或多个对象文件link到一起构成一个应用
2、计算表达式顺序:C++会优先计算/,*,%(从左至右计算),再完成+-,然后是位操作
3、栈帧
是编译器用来实现函数调用的一种数据结构
栈帧为每个函数提供一个独立的内存工作区,若变量是在func1()栈帧中声明的,那么调用func2()函数不会对它带来改变,除非专门修改
当func1()调用func2()时,func2()就有了自己的栈帧(stack frame)以供使用
从func1()传到func2()的参数会从func1()栈帧复制到func2()栈帧中
4、int i=10;
int *p1=&i; // p1指向栈内存
int *p2=new int ; // p2指向堆内存
*p2=10; //没有改变指针,只改变了指针的指向。若此句改成p2=10,则指针指向内存地址为10,危险行为
5、char c1[20]=”hello world”;
char *c2=”hello world”;
对于c1,编译器会在栈中分配20字符空间,以\0结束,后面是一些随机值,数组长度为20,但处理时会忽略掉\0后面的所有内容
对于c2,编译器在栈中分配内存来保存指针c2
c2指向编译器预留的内存区,用以保存常量串”hello world”,也以\0结束