c语言关键字static,const,extern,struct,enum,union

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()
{
  constintnum =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()
{
  inttmp = 23;
  constint*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()
{
  inttmp = 100;
  int*constnum = &tmp;
  printf("result=%d\n",*num); 
  intchange = 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;
}



union 共用体

共用体成员占用同一段内存,修改一个会影响所有

结构体成员占不同内存,互相无影响


typedef 给类型起外号

typedef int INT   int 就可以写成INT








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值