一.关键字
static 静态的 用来修饰变量和函数
1.可以修饰局部变量
2.可以修饰全局变量
3.可以修饰函数
1.
改变了存储类型(栈区到静态区)
但是作用域是不会改变的,要想在外部使用还是不行,但是它的值是可以改变的
static修饰的局部变量和程序的声明的周期一样
2.修饰全局变量
全局变量是如何被找到使用的
static修饰全局变量的时候改变了全局变量的外部链接属性
修饰后变成了内部链接属性
这时static修饰的全局变量只能在本源文件(.c)中使用,其他文件无法使用
3.static修饰函数
函数也是具有外部链接属性的 ,被static修饰的时候也只能在本源文件内部使用,其他文件不能再使用了,和全局变量相似
二.定义常量和宏
宏不是函数,宏就相当于替换
宏一般都是大写(习惯)
函数首字母大写
三.指针
必须先理解内存
生活中:房间 编号(地址)
内存单元 编号(地址)
内存单元的编号也被称为地址
内存存的是第一个字节的地址
int a = 10;
int* pa = &a //pa被称为指针变量
*pa=20; //*解引用操作符
指针变量是用来存放地址的一种变量
再指针变量的眼里就是地址,指针就是用存放地址的
指针变量是用来存放地址的,地址的存放需要多大空间,指针变量的大小就该是多大空间
32位的机器——支持32位的虚拟地址空间——产生的地址就是32bit的——需要32bit的存储空间——指针变量8个字节
64位的机器——支持64位的虚拟地址空间——产生的地址就是64bit的—— 需 要32bit的存储空间——指针变量8个字节
四.结构体
如何描述生活中的复杂对象,就需要结构体来描述生活中的复杂对象
struct Stu //相当于图纸,不占用内存空间
{
char name[20];
int age;
char sex[5];
double score; //成绩
}; //这里有分号
int main() //描述一个学生
{
struct Stu s1 = {"刘海迪",21,"男",100.0};
struct Stu s2 = { "张三",20,"女",0.0 };
struct Stu* ps = &s1;
printf("%s %d %s %lf\n",s1.name,s1.age,s1.sex,s1.score);
printf("%s %d %s %lf\n", s2.name, s2.age, s2.sex, s2.score); //.就是结构成员访问操作符
printf("%s %d %s %lf\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).score);
printf("%s %d %s %lf\n", ps->name, ps->age, ps->sex, ps->score);//这两种方法等价 ->也是一种结构成员访问操作符
return 0;
}
格式就是结构体变量.结构体成员
那指针应该如何去写呢
struct Stu* ps= &s1;
(*ps).name, (*ps).age, (*ps).sex, (*ps).score
ps->name, ps->age, ps->sex, ps->score
用箭头的就是结构体指针->结构体成员
如果要用输入的话可以写
scanf("%s %d %s %lf",s1.name,&(s1.age),s1.sex,&(s1.score));
因为name和sex定义的是数组,数组名本来就是地址所以不用取地址符,但是其他的就要整个括起来