黑马程序员---C语言基础---结构体、枚举、typedef、宏、static和extern

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、结构体

数组的元素必须为同一类型,当我们需要将不同类型的数据存放到一起时,数组解决不了问题,这时我们就需要结构体
1.结构体定义:
struct Information {
    int age;
    int height;
    char name[20];
    int weight;};
};

这里定义了一个名为Information的结构体,结构体元素包括年龄、身高、姓名、体重,但程序中操作的是结构体变量,所以下面定义一个结构体变量inf

struct  Information  inf;

定义结构体系统不会给它分配存储空间,当定义结构体变量时才会分配内存空间
2.结构体变量初始化:(注:只能在定义变量的同时进行初始化)
struct  Information  inf = {25,170,"jack",65};
3.结构体变量的使用:
printf("年龄为%d,身高为%d",inf.age,inf.height);
结构体变量的成员用“结构体变量名.成员名”的方式进行访问
4.结构体数组:
即定义结构体变量时是以一个数组来定义的,数组中每个元素都为该结构体类型
struct Information {
    int age;
    int height;
    char name[20];
    int weight;};
}inf[2] = {{25,170,"jack",65},{23,165,"rose",50}};
5.结构体指针:
struct  Information  inf = {25,170,"jack",65};
struct  Information  *p = &inf;
访问结构体成员名方法有:
printf("age = %d",(*p).age);
printf("age = %d",p->age);

二、枚举

枚举是C语言中的一种基本数据类型,不是构造类型,当一个变量只能有几个固定的取值时,即可将该变量定义为枚举型,如性别、季节等
1.定义:enum 枚举名{枚举元素1,枚举元素2......};
enum Season {spring,summer,autumn,winter};
enum Season {spring,summer,autumn,winter}  s;
enum {spring,summer,autumn,winter}  s;
C语言编译器会将枚举元素作为整型常量处理,即依次给每个元素赋值0,1,2……也可以手动赋值:
enum Season {spring,summer = 3,autumn,winter};
赋值后的值依次为0,3,4,5
2.遍历枚举元素
for (s = spring;s<=winter;s++){
    printf("枚举元素:\n",s);
}

三、typedef

1.typedef在C语言中用来给各种数据类型取别名,例:
typedef  int  i;
typedef  float  f;
2.用于给指针取别名,例:
typedef  char  *aaa;
aaa即为一个指向字符型的指针类型
3.用于给结构体取别名:
struct Information {
    int age;
    int height;
    char name[20];
    int weight;};
};
typedef  struct Information IN;
这里将IN定义为该结构体类型的别名
4.typedef用于给枚举类型取别名,例:
enum Season {spring,summer,autumn,winter};
typedef  enum Season  S;
S即为该枚举类型的别名

四、宏

1.宏定义形式:
#define  M  10
其作用是在编译预处理阶段,将程序中的“M”替换成10,也可用于定义有参宏:
#define  SUM(a)  (a+a)
这里是将“SUM(a)”替换成“(a+a)”,注意这里一般用括号括住字符串的参数和计算结果
2.使用注意:
1)宏名一般用大写字母,以便与变量名区别开来,但使用小写没有语法错误
2)对用双引号括起来的宏字符不进行宏替换操作
3)在编译预处理阶段不作语法检查,只是简单替换,在编译时再进行语法检查
4)宏作用范围从定义到文件结束,若想终止宏作用域,用#undef命令,之后的宏名不再进行宏替换
3.宏与函数的区别
1)宏定义不涉及内存空间的分配、参数类型的分配、参数传递和返回值等问题
2)函数是在程序运行时执行,宏替换是在编译预处理阶段进行,后者执行效率更高
4.typedef和#define的区别:
#define  INT  int*
typedef  int*  INT1 ; 

INT  p1,p2,p3;
INT1  p4,p5,p6;
上面代码中宏替换后INT定义的3个变量中,只有p1是int类型的指针,而INT1定义的3个变量都为int类型的指针,所以,给类型起别名最好使用typedef

五、static和extern

static和extern是用来控制变量或者函数作用域的关键字
1.修饰局部变量
这里需要注意的是extern不能修饰局部变量,static修饰局部变量时,该语句只执行一次,被修饰变量作用域会延长到程序结束
for(int i = 0;i<3;i++){
    static  int  a = 10;
    a += 1
    printf("%d",a);
}
这里虽然a的初始化在循环内,但它被static修饰,所以初始化只执行一次,打印结果为“111213”
2.修饰全局变量
static  int  a = 2;
extern  int  b = 5;
变量a是一个内部变量,只能在本文件中访问与其他文件同名变量互不干扰。而b则是一个外部变量,只要导入上面代码所在头文件,b在本工程下每个文件都可以访问,注意extern不能修饰多个同名变量
3.修饰函数
static修饰函数时,该函数为一个内部函数,只能在文件内部使用。extern修饰的函数为外部函数,只要在使用前进行声明,工程内各个文件都可以访问,但不能有同名的外部函数






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值