一、变量
1.局部变量
局部变量的定义:在{}内
局部变量的申明周期:离开大括号就结束
为什么局部变量离开大括号{}生命周期就结束呢?————内存(栈区)
2.全局变量
全局变量 ——内存在全局区
全局变量在整个程序里面都可以被访问
3.静态变量
静态变量只初始化一次,存放在全局区
二、内存
1.栈区:一种先进后出的存储结构, 函数的参数,函数的返回值都是栈区变量。不需要用户申请释放,编译器自动完成
2.全局区:程序被加载到内存时就已经分配好,程序退出时才从内存中消失。
3.静态全局区:static函数
4.堆区:一个比较大的内存容器(比栈区大,约为4G大小),需要我们手动的申请和释放内存。
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b;// 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //"123456"在全局区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //"123456"放在全局区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
三、版本
1.发行版本——release版本(正式版本)
2.测试版本——Beta版本(Debug版本,比正式版本要大)
四、纠错
打开终端输入:gcc -g 文件名.c
gdb a.out
run
五、三目运算符及NULL
条件判断 ? 返回值1:返回值2;
int a = 5;
int b = 3;
int c = a > b ? 1 : 0;//c = 1
判断a是否大于b,如果大于则返回 1,如果小于返回0。
int res = ptr == NULL ? 1 : 0;//判断字符串ptr是否为空
当字符串为NULL时,则不能使用strlen,strcpy,strcat等函数,因为NULL段是受保护的区域。
六、复合数据类型
1.结构体的定义:用来描述复杂对象,如:书,人等具有多个特征的变量。
struct Person//定义结构体名称
{
/*多个特征变量*/
int age; //4
char name[20]; //20
char sex ; //1
int height; //4
};
2.结构体内存:因为内存对齐缘故,所定义的特征变量不同,所占大小也不同。(如上面所示,理论上内存大小为29字节,实际为32字节)
/*结构体的定义*/
struct Person per1;
/*结构体占用内存大小:因为有内存对其的缘故,所以占用了32字节*/
int size = sizeof(per1);
printf("size = %d\n",size);
3.结构体的赋值:结构体名称.特征变量;
per1.age = 20;
per1.height = 180;
per1.sex = 'm';
strcpy(per1.name,"zhangsan");//因为per1.name是地址,没有内存,所以用strcpy
4.结构体的取值:printf("特征变量对应的数据类型",结构体名称.特征变量);
printf("name = %s, age = %d, sex = %c,height = %d\n",per1.name,per1.age,per1.sex,per1.height);
5.结构体数组的定义:用于定义多个同种复杂类型对象。
struct Person per[3];//定义Person类型的结构体数组per[3]
6.结构体数组的赋值:结构体数组名[ X ].特征变量
per[0].age = 20;
per[0].height = 180;
per[0].sex = 'm';
strcpy(per[0].name,"zhangsan");
per[1].age = 21;
per[1].height = 179;
per[1].sex = 'f';
strcpy(per[1].name,"lisi");
per[2].age = 18;
per[2].height = 175;
per[2].sex = 'm';
strcpy(per[2].name,"xiaogu");
7.const函数:表示里面的数据只能被读取,不可以被更改。(为了防止疏忽,将重要数据错误更改)
当使用const函数是,结构体的输出变为:printf("特征变量对应的数据类型",结构体名称->特征变量);
#include <stdio.h>
#include <string.h>
/*复合数据类型*/
struct Person
{
int age; //4
char name[20]; //20
char sex ; //1
int height; //4
};
/*const constan.恒定不变的,所定义的数据不能变*/
void printPersoInfo(const struct Person *per1)
{
/*结构体的取值*/
printf("name = %s,age = %d,sex = %c,height = %d\n",per1->name, per1->age, per1->sex, per1->height);
}
/*姓氏排序*/
void sortPersonInfo(struct Person *per2,int len)
{
for(int i = 0;i < len;i++)
{
for(int j = i +1;j < len;j++)
{
int n = strcmp(per2[i].name,per2[j].name);
if(n > 0)
{
struct Person p2 = per2[j];
per2[j] = per2[i];
per2[i] = p2;
}
}
}
}
int main()
{
struct Person per[3];//定义结构体数组
per[0].age = 20;
per[0].height = 180;
per[0].sex = 'm';
strcpy(per[0].name,"zhangsan");
per[1].age = 21;
per[1].height = 179;
per[1].sex = 'f';
strcpy(per[1].name,"lisi");
per[2].age = 18;
per[2].height = 175;
per[2].sex = 'm';
strcpy(per[2].name,"xiaogu");
int length = sizeof(per)/sizeof(per[0]);//结构体数组长度
sortPersonInfo(per,length);//排序函数
for(int i = 0;i < 3;i++)
{
printPersoInfo(&per[i]);
}
return 0;
}