内存,程序在内存中运行。(进程)
栈:存放的是值类型数据,前提是局部变量,是由系统分配和释放的,效率高,优先使用栈空间,优先使用局部变量。两个函数中相同名字的常量在栈中是不会冲突的,因为存放的区域并不一样。
堆:存放的是引用类型的,用户自己分配,自己释放malloc---free
void *malloc(分配空间大小);
int *p=malloc;
free(p);//不会对内存进行操作。free完之后就是把空间释放了然后可以再存储,不free的话原本的数据是不会改变的。
数据区:全局变量,常量。存储类型(静态)static,数据段的数据一直存在直到程序结束。
static int a=100;全局作用域
void fun(){
static int a =200;函数作用域
a++;
printf("%d\n",a);
}
a,b都存储在数据段,静态变量只初始化一次。
fun();a=201;
fun();a=202;
fun();a=203;
自动,外部,寄存器(多文件开发)
auto extern register
auto--默认
extern---多个文件共享一个变量。全局同名变量
如果加上static限制了变量在本文件中使用
多文件编译:gcc -o a.c b,c
register ---寄存器变量 (速度快,资源少,不允许取寄存器变量地址)寄存器变量不一定放在寄存器。
register int num=0; (是否放在寄存器是由寄存器决定,申请为寄存器变量就不能用取地址符取地址)
一个变量被循环重复利用的次数很多的时候就定义为寄存器变量。
预处理(头文件,调试)
头文件(避免头文件重复加载)
#ifndef xxx
#define xxx
文件文件内存
#endif //xxx
//必须一行完成(如果写不完就用换行符\换行)
#define Debug(x) printf("%s-%d-%s\n",_FILE_,_LINE_,x)
_LINE_表示行
定义常量
#define MAXNUM 100;
跨平台:(在不同平台中的代码不一样,根据平台选择代码)
#define IOS
#ifdef IOS
Debug("ios");
#else
debug("linux");
#endif
return 0;
#if 0 //if后面必须是真假值,不能写其他
屏蔽代码段
#endif
自定义数据类型(把已有的数据类型定义别名)
typedef unsigned int uint_32;
作用是增强程序的可读性。
typedef int(*fun)(int); 可以用fun定义一个指针,fun p;(p就是一个函数指针);