c语言的自定义类型-创新互联
c语言的自定义类型
网页题目:c语言的自定义类型-创新互联
转载来于:http://azwzsj.com/article/disijs.html
- 一,结构体
- 1.说明
- 2.声明
- 3.应用
- 4.结构体变量的定义和初始化
- 5.结构体内存对齐:计算结构体的大小
- 6.为什么存在内存对齐
- 二,枚举
- 三,联合(共用体)
2.声明结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
struct tag
{member - list;
}variable-list;
3.应用//struct Stu
//{// char name[20];
// int age;
//}s1,s2;//全局变量,s1和s2是两个结构体变量
typedef struct Stu
{char name[20];
int age;
}stu;
int main()
{struct Stu s3, s4;//局部变量
stu s5;
return 0;
}
特殊的声明:在声明结构体的时候,可以不完全声明
匿名结构体
struct
{int a;
char b;
float c;
}x,a[20],*p;
p=&x;同一个类型的匿名结构体,只能使用一次,该语句不合法
typedef struct
{int date;
Node* next;//Node是重命名过后才有的,这是先有鸡还是先有蛋的问题,这样做是不能通过的
}Node;
typedef struct Node
{int date;
Node* next;//同上
}Node;
//
typedef struct Node
{int date;
struct Node* next;//合法
}Node;
4.结构体变量的定义和初始化struct point
{int x;
int y;
}p1 = {10,20};
struct point p2 = {0,0 };
struct s
{int num;
char ch;
struct point p;
float d;
};
int main()
{struct point p3 = {1,2 };
struct s s = {100,'m',{2,5},3.14f };
struct s s2 = {.d=1.2f,.p.x=3,.p.y=5,.ch='w',.num=200};//乱序赋值,通过‘ . ’实现
printf("%d %c %d %d %f\n", s.num, s.ch, s.p.x, s.p.y, s.d);
printf("%d %c %d %d %f\n", s2.num, s2.ch, s2.p.x, s2.p.y, s2.d);
return 0;
}
5.结构体内存对齐:计算结构体的大小#includestruct s1
{char c1;
int i;
char c2;
};
struct s2
{char c1;
char c2;
int i;
};
struct s3
{double c1;
char c2;
int i;
};
struct s4
{char c1;
struct s3 s3;
double d;
};
int main()
{printf("%d\n", sizeof(struct s1));
printf("%d\n", sizeof(struct s2));
printf("%d\n", sizeof(struct s3));
printf("%d\n", sizeof(struct s4));
printf("%d", offsetof(struct s1, c2));//offsetof是宏,计算的是结构体变量在结构体中的偏移量
return 0;
}
6.为什么存在内存对齐1.结构体的第一个成员,对齐到结构体在内存中存放位置的0偏移处
2.从第二个成员开始,每个成员都要对齐到(一个对齐数)的整数倍偏移处 对齐数:结构体成员自身大小和默认对齐数的较小值(vs的默认对齐数是8)
3.结构体的总大小,必须是所有成员的对齐数中大对齐数的整数倍,包含嵌套结构体成员中的对齐数。
4.如果结构体中嵌套了结构体成员,要将嵌套的结构体成员对齐到自己的成员中大对齐数的整数倍数
二,枚举1.平台原因 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常
2.性能原因 数据结构(尤其是栈)应该尽可能在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问; 而对齐的内存访问仅需要一次访问;
总体来说:结构体的内存对齐是拿空间换时间的做法
枚举:
enum color
{blue,
red,
green,
yellow
};//枚举常量如果不初始化,则常量的值默认从零开始,并依次增1,也就是0,1,2,3
enum color
{blue,
red,
green=6,
yellow
};//枚举常量被赋值,因此常量值为0,1,6,7
//既然是常量,值就不能被修改
三,联合(共用体)//联合(共用体)
union Un
{char c;
int a;
};//两个变量共用同一块空间
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页题目:c语言的自定义类型-创新互联
转载来于:http://azwzsj.com/article/disijs.html