程序运行的各个阶段
.c 或者.cpp 文件 源文件;
预编译形成.i文件;
编译形成.o或者.obj二进制可执行文件;
链接形成.exe文件;
宏操作符(#define)
在预编译阶段执行 进行替换 不进行类型检验 不进行分配空间;
用于预编译处理阶段;将宏参数转换为字符串;只有宏定义中使用#define;
例子:#define MAXLENTH 100
const
在编译阶段进行 进行类型检测 进行分配空间;
pragma once
一个比较常用的c/c++的杂注,只要在头文件的最开始加上这个;就能保证头文件只被编译一次;
##操作符
用于预处理阶段,将粘连两个标识符,只有宏定义中使用;
例子:
#define Connect(a,b) a##b
int Conect(a,1); //int a1
a1 = 2;
指针
-
指针有三个值 &p是指针p的地址;
-
p是指针p自身的值;
-
*p是指针p指向的值;
int *p = &a; // & *p<=>&a; *&p<=>&a; int *p = &b; //把b的地址给p ,*是标识符;*p是p指向的值;
指针和引用的区别
Student *st st为指针;引用时为st->s_name//st->s_id;
Student &sp sp为别名;引用时为sp.s_name//sp.s_id;
存储区域的区别
1.代码区:存放函数体的二进制代码;
2.数据区/data:全局变量,静态变量和常量是分配在数据区中的,数据区包括bss(未初始化数据区)和初始化数据区。
3.堆区/heap:由程序员手动分配和释放空间,通过mallic/new等关键字申请;使用完后必须释放;使用free(p);释放后p为失能指针或失效指针;
4.栈区/ stack:由编译器自动分配释放,存储函数内部的局部变量的值,函数参数的值和自定义对象的引用和函数的返回地址;是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。
注意:
(1)堆向高内存地址生长;
(2)栈向低内存地址生长;
(3)堆和栈相向而生,堆和栈之间有个临界点,称为stkbrk;
注意:
未初始化数据区(BSS):用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。
指针 引用和const的混用
int main()
{
int a = 10, b = 20;
int *p1 = &a;
*p1 = 100;
p1 = &b;
const int *p2 = &a; **//指针指向的值不能变;不能修改;**
*p2 = 100; **// * p2是常量 不能赋值;**
p2 = &b;
int const *p3 = &a; **//指针指向的值不能变;不能修改;**
*p3 = 100; **// * p3是常量 不能赋值;**
p3 = &b;
int * const p4 = &a; **//指针自身的值不能变;不能修改;**
*p4 = 100;
p4 = &b; **//p4是常量;不能赋值;**
const int * const p5 = &a; **//指针指向的值和自身的值都不能变;都不能修改;**
*p5 = 100; **//p5是常量不能赋值;**
p5 = &b; **// * p5是常量不能赋值;**
return 0;
}