作用域
1.全局变量
①作用域:函数内部
②生命周期:从局部变量创建到函数结束
③存储位置:栈区
2.局部变量
①作用域:项目中所有文件
②生命周期:从程序创建到程序销毁
③存储位置:数据区
3.静态全局变量
①作用域:函数内部
②生命周期:从程序创建到程序销毁
③存储位置:数据区
4.静态局部变量
①作用域:定义所在文件中
②生命周期:从程序创建到程序销毁
③存储位置:数据区
5.全局函数
①作用域:项目中所有文件
②生命周期:从程序创建到程序销毁
③存储位置:代码区
6.静态函数
①作用域:定义所在文件中
②生命周期:从程序创建到程序销毁
③存储位置:代码区
内存模型
1.代码区
程序执行二进制代码(程序指令)(共享、只读)
2.数据区
①初始化数据区(data)
②未初始化数据区(bss)
③常量区
3.栈区:
系统为每一个程序分配一个临时的空间
存储内容:局部变量、函数信息、函数参数、数组
栈区大小:1M
(注意:在windows中可以扩展到10M,在linux中可以扩展到16M)
4.堆区
存储内容:大数据、图片、音乐、视频
(补充:堆区容量比较大,可以进行开辟和释放
手动开辟用malloc ,手动释放 用free)
各个区的内存位置如图
堆空间到开辟(malloc)和释放(free)示例:
void main()
{
//开辟对空间存储数据
int* p = (int*)malloc(sizeof(int));
printf("%p\n", p);
//使用堆空间
*p = 123;
printf("%d\n", *p);
//释放堆空间
free(p);
}
内存空间处理函数
1.memset:重置内存地址
2.memcpy:内存拷贝
3.memmove:内存拷贝(跟mencpy拷贝方式不同,这个是一个一个移除添加来完成拷贝工作的,memcpy是直接全部替换)
4.mencmp:内存比较
结构体
1.格式
struct 结构体名
{
姓名
年龄
成绩
};
示例1(结构体简单使用)
struct student
{
char name[21];
int age;
int score;
char addr[51];
};
void main()
{
struct student stu;
strcpy(stu.name, "张三");
stu.age = 10;
stu.score = 90;
strcpy(stu.addr, "广东揭阳");
//或者struct student stu={"张三",10,90,"广东揭阳"};
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("分数:%d\n", stu.score);
printf("地址:%s\n", stu.addr);
}
运行结果
示例2(结构体数组)
struct student
{
char name[21];
int age;
int score;
char addr[51];
};
void main()
{
struct student stu[2] =
{
{"张三",10,90,"广东揭阳"},
{"李四",20,100,"广东惠州"}
};
printf("姓名:%s\n", stu[1].name);
printf("年龄:%d\n", stu[1].age);
printf("分数:%d\n", stu[1].score);
printf("地址:%s\n", stu[1].addr);
}
运行结果
示例3(结构体嵌套)
struct scores
{
int c1;
int cpp;
int cs;
};
struct student
{
char name[21];
int age;
struct scores ss;
char addr[51];
};
void main()
{
struct student stu;
strcpy(stu.name, "张三");
stu.age = 20;
stu.ss.c1 = 80;
stu.ss.cpp = 86;
stu.ss.cs = 90;
strcpy(stu.addr, "广东揭阳");
printf("%s\n %d\n %d\n %d\n %d\n %s\n", stu.name, stu.age, stu.ss.c1, stu.ss.cpp, stu.ss.cs, stu.addr);
}
运行结果
示例4(结构体和指针)
struct student
{
char* name;
int age;
int* scores;
char* addr;
};
void main()
{
struct student stu;
stu.name = (char*)malloc(sizeof(char) * 21);
stu.scores = (int*)malloc(sizeof(int) * 3);
stu.addr = (char*)malloc(sizeof(char) * 51);
strcpy(stu.name, "张三");
stu.age = 20;
stu.scores[0] = 90;
stu.scores[1] = 95;
stu.scores[2] = 99;
strcpy(stu.addr, "广东揭阳");
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("分数:%d\n", stu.scores[0]);
printf("分数:%d\n", stu.scores[1]);
printf("分数:%d\n", stu.scores[2]);
printf("地址:%s\n", stu.addr);
}
运行结果
联合体(共用体)(union)
①联合体中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖
②联合体变量得地址和它的各成员变量的地址都是同一个地址
③联合体所占内存长度等于其最长成员的长度整数倍数
枚举
示例
enum Color
{
red,blue,green,pink
}color;
void main()
{
int value;
scanf_s("%d", & value);
switch (color)
{
case red:
printf("红色\n"); break;
case blue:
printf("蓝色\n"); break;
case green:
printf("绿色\n"); break;
case pink:
printf("粉色\n"); break;
}
}
运行结果
转载至
http://blog.bools.cn/archives/209