static:
1全局静态变量:作用范围局限于他的源文件,只有本文件内可用,变量名在其他文件不可用;
2局部静态变量:局限于特定函数,出作用域不会释放。
3静态函数:和全局静态变量差不多
4存放位置:程序开始,存放在全局数据区,结束释放空间,默认初始化为0,使用时可变其值。
#include <stdio.h>
static int j; // 静态全局变量
int fun1(void)
{
static int i = 0;
i++;
return i;
}
int fun2(void)
{
j = 0;
j++;
return j;
}
int main(int argc, char *argv[])
{
int k = 0, m = 0, n = 0;
for(k=0; k<10; k++){
m = fun1( );
n = fun2( );
printf("%d,%d\n", m, n);
}
return 0;
}结果为11,21,31,41,.....,101.j始终为1.
const 只读变量,具有不可变性
1#define 宏没有类型,const修饰只读变量具有类型
#define N 5
const int N = 5
2节省空间,避免不必要的内存分配,提高效率
3修饰一般变量 const int i = 2
#include <stdio.h>
int
main()
{
const
int
num =23;
printf
(
"result=%d\n"
,num);
num =31;
printf
(
"result=%d\n"
,num);
//报错,num是常量,不能修改
}
4修饰数组 const a[5] = {1,2,3,4,5}
5修饰指针 const int *p 和 int const *p p可变,p指向对象不可变
#include <stdio.h>
int
main()
{
int
tmp = 23;
const
int
*num = &tmp;
printf
(
"result=%d\n"
,*num);
(*num) = 24;
//报错,因为指针num指向的int类型的对象是不能进行修改的。num可变,*num不可变
printf
(
"result=%d\n"
,*num);
}
int *const p p不可变,p指向对象可变
#include <stdio.h>
int
main()
{
int
tmp = 100;
int
*
const
num = &tmp;
printf
(
"result=%d\n"
,*num);
int
change = 23;
num = &change;
//报错,因为指针num是不能进行修改的,num 等同于p
printf
(
"result=%d\n"
,*num);
}
const int *const p 都不可变
6修饰函数参数 void fun(const int *p)
7修饰函数返回值 const int fun(void)
extern 外来的
#include<stdio.h>
int func();
int main()
{
func();//1
externint num;
printf("%d",num);//2
return0;
}
int num = 3;//一定是全局变量
int func()
{
//int
num = 3;写在这里错误
printf("%d\n",num);
}
要注意的是无论是同一个文件中还是来自两个文件中。有当一个变量是一个全局变量时,extern变量才会起作用。
struct 结构体存放不同类型的数
#include <stdio.h>
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1;
结构体数组
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[5];
表示一个班级有5个学生。
结构体数组在定义的同时也可以初始化,例如:
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}class[5] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
结构体指针
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//结构体指针
struct stu *pstu = &stu1;
enum 枚举类型
#include<stcdio.h>
#define Mon1
int main()
{
enum week{ Mon =1, Tues, Wed,
Thurs, Fri, Sat, Sun
} day;
scanf("%d",&day);
switch(day)
{
case Mon:puts("Monday");
break;
case Tues:puts("Tuesday");
break;
case Wed:puts("Wednesday");
break;
case Thurs:puts("Thursday");
break;
case Fri:puts("Friday");
break;
case Sat:puts("Saturday");
break;
case Sun:puts("Sunday");
break;
default:puts("Error!");
}
return 0;
}
共用体成员占用同一段内存,修改一个会影响所有
结构体成员占不同内存,互相无影响
typedef 给类型起外号
typedef int INT int 就可以写成INT