C语言除了定义变量使用到的简单类型,如int、char、float、指针,更高级的是将这几种类型进行重定义或者结合使用。分别介绍typedef; struct; union; enum
typeof 别名定义出一种新的类型,可以封装数据类型,方便移植;简化函数指针的定义;
#include <stdio.h>
typedef int de_int;
int main(void)
{
de_int i = 10;
printf("%d\n", i);
}
需要注意与define进行区别,define相当于声明,使用可以当作是替换,代码中d1类型是char*,而d2是char
#include <stdio.h>
#define defineType char*
typedef char* typedefType;
int main(void)
{
defineType d1,d2; // char *d1, d2
typedefType t1,t2; // char* d1,d2
}
struct 结构体,不同类型元素集合
- 结构体类型
// 匿名结构体
struct {
int age;
char sex;
} a,b;
// 有名结构体
struct Per {
{
int age;
char sex;
};
struct Per a, b;
// typedef 别名结构体
struct Per {
{
int age;
char sex;
};
typedef struct Per person;
person a,b;
- 结构体变量赋值及引用;结构体使用.获取属性值,结构体指针使用->获取
#include <stdio.h>
struct Per {
int age;
char sex;
char name[10];
};
typedef struct Per perdef;
int main(void)
{
perdef one = {10, 'm', "wang"};
printf("%s\n", one.name);
strcpy(one.name, "ligbee");
printf("%s\n", one.name);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct _per {
int age;
char sex;
char* name;
};
int main(void)
{
struct _per* one;
one = (struct _per*)malloc(sizeof(struct _per));
one->age = 1;
one->sex = 'm';
one->name = "hello";
printf("%s\n", one->name);
printf("%d\n", one->age);
free(one);
}
- 结构体size
结构体成员地址从低到高分配连续分配,首成员对应低地址;最小整形变量对齐,以4字节为准。
struct Per {
int age;
char sex;
};
//占据5字节
struct Per {
char sex;
int age;
};
//占据8字节,char本身1字节,因为按4字节对齐,所以移动3字节,再分配int占4字节
- 结构体赋值
相同类型结构体变量可以直接赋值,相同类型的数组之间不可以直接赋值
union 共用体,union中可以定义多个成员,使用不同类型的变量占据共同的内存,共用体大小为元素中最大字节量
#include <stdio.h>
union ITEM {
int one;
char two;
};
int main(void)
{
union ITEM a;
printf("size:%ld\n", sizeof(a));
a.one = 66;
printf("one:%d--two:%c\n", a.one, a.two);
a.two = 'A';
printf("one:%d--two:%c\n", a.one, a.two);
return 0;
}
// size:4
// one:66--two:B
// one:65--two:A
enum 枚举,将变量的值一一列举出来,变量只能在列举的范围内取值;枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量,其值分别为0,1,2...
#include <stdio.h>
enum COLOR {
RED,BLACK,BLUE,WHITE
};
enum RAND {
one = 10, two, three
};
enum RANDOM {
one, two = 10, three
};
int main(void)
{
enum COLOR item;
item = BLUE;
printf("%d\n", item);
}