typedef关键字可以给数据类型起别名。
结构体。结构体可以如下定义一个结构体变量
变量的地址必须是变量大小的整数倍,这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。数据对齐会导致结构体中不同变量之间有空隙,结构体变量的大小并不是其中所有成员变量大小之和。程序员在声明(定义)结构体时应该尽可能地组织结构体的成员以图结构体变量占有空间尽可能小。
结构体。结构体可以如下定义一个结构体变量
/*
* 结构体
* */
#include <stdio.h>
/*struct {
int age;
char gender;
float height;
} student;//声明(定义)无名结构体的同时定义了结构体变量student
*/
/*struct student {
int age;
char gender;
float height;
} student;//声明(定义)结构体struct student的同时定义了结构体变量student
*/
/*struct student {
int age;
char gender;
float height;
};
typedef struct student stu;//将结构体类型名称重定义为stu.自重定义所在位置起就可以使用stu代替struct student了
*/
typedef struct {
int age;
char gender;
float height;
} stu;//将无名结构体的类型名称重定义为stu.自重定义所在位置起就可以使用stu这个无名结构体了
int main()
{
/*
struct student {
int age;
char gender;
float height;
};
struct student student;//这里前一个student和struct和起来共同代表是一个结构体名称;后一个student是结构体变量名称;
*/
/*
struct student {
int age;
char gender;
float height;
} student;//声明(定义)结构体struct student的同时定义了结构体变量student
*/
/*
struct {
int age;
char gender;
float height;
} student;//声明(定义)无名结构体的同时定义了结构体变量student
*/
stu student = {24, 'E', 1.60f};
printf("年龄是%d\n", student.age);
printf("性别是%c\n", student.gender);
printf("身高是%.2f\n", student.height);
return 0;
}
变量的地址必须是变量大小的整数倍,这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。数据对齐会导致结构体中不同变量之间有空隙,结构体变量的大小并不是其中所有成员变量大小之和。程序员在声明(定义)结构体时应该尽可能地组织结构体的成员以图结构体变量占有空间尽可能小。
/*
* 结构体变量占存储区大小
*
* 计算机数据存储的对齐和补齐
* 计算器要求数据所占存储空间的起始地址应该是数据本身大小整数倍
* 对齐:变量的地址必须是变量大小的整数倍。这叫做数据对齐。double变量的地址只需要是4的整数倍就可以了。
* 补齐:结构体大小必须是其中最大成员变量的大小的整数倍。
* double变量大小按照4字节计算。为了保证这一点,有时需要在结构体变量后面加入一些浪费的字节。这叫做补齐。
*
* 数据对齐导致结构体中不同成员之间有空隙,结构体变量的大小并不是其中所有成员变量的大小之和。补齐导致结构体尾部加入了一些浪费字节。
*
*
* 计算机对内存的管理是分组的,四个字节一组,每一组开头的字节的地址肯定是4的整数倍,第三个字节是2的整数倍。数据不能跨组存放。但是双精度浮点型double例外,double可以跨组存放。
* 总结一下,可以得出数据所占空间的起始地址应该是数据本身大小的整数倍。
* */
#include <stdio.h>
typedef struct {
char ch;
char ch1;
int value;
} stru1;
int main()
{
printf("结构体stru1大小是%d\n", sizeof(stru1));
return 0;
}
/*
* 结构体位域练习
*
* 声明结构体的时候可以使用位域限制某个成员变量所占的二进制位数,所有的定点数变量都可以使用位域
*
* */
#include <stdio.h>
typedef struct {
int gender:1;
int age:6;
}stru1;
int main()
{
stru1 stru;
//printf("&(stru.age)是%p\n", &(stru.age));//有编译错误 error: cannot take address of bit-field 'age'
printf("大小是%d\n", sizeof(stru1));
return 0;
}
计算机内存管理存放数据可以是按照高位高字节存放,低位低字节存放,俗称"小端存储方式";也可以是低位高字节存放,高位低字节存放,俗称"大端存储方式"
通过检测一个联合体变量可以迅速测试得知当前计算机内存管理是按照"小端存储方式"还是"大端存储方式"。代码如下:
/*
* 高位高字节,低位低字节存放,俗称"小端存储方式";
* 低位高字节,高位低字节存放,俗称"大端存储方式"
*
* 以下程序可以迅速测试机器是那种存储方式
* */
#include <stdio.h>
typedef union {
char ch[4];
int value;
} un;
int main()
{
un u;
u.value = 0x12345678;
if (0x78 == u.ch[0]) {
printf("小端\n");
}
else {
printf("大端\n");
}
printf("ud 大小是%d\n", sizeof(u));
}
/*
* 枚举练习
* */
#include <stdio.h>
main()
{
enum em {SPRING, SUMMER, AUTUMN, WINTER};
/*
* const int SPRING = 0;
* const int SUMMER = 1;
* const int AUTUMN = 2;
* const int WINTER = 3;
*
* */
typedef enum em season;
printf("season大小是%d\n", sizeof(season));
printf("SPRING是%d\n", SPRING);
season s = SUMMER;
/* int s = 1;*/
printf("s是%d\n", s);
}
/*
* 枚举练习
*
* */
#include <stdio.h>
#define N 2
enum sex {MAN, WOMAN};
main()
{
enum sex sexs[N] = {MAN, MAN};
printf("sexs[0]是%d\n", sexs[0]);//输出0
printf("sexs[1]是%d\n", sexs[1]);//输出0
sexs[0] = WOMAN;//把整型数1放入sexs[0]
sexs[1] = 1u;//把整型数1放入sexs[1]
printf("sexs[0]是%d\n", sexs[0]);//输出1
printf("sexs[1]是%d\n", sexs[1]);//输出1
sexs[1] = -1;//把整型数-1放入sexs[1];编译器不报警告
printf("sexs[1]是%d\n", sexs[1]);//输出-1
}