c关键字刨析(6)

118 阅读2分钟

struct解

  • 具有相同,和不同类型的集合
# define NUM 64
// 定义结构体,本质是制作类型
struct stu {
	char name[NUM / 2];
	int age;
	char sex;
	char addr[NUM];
}a,b,c;

int main()
{

	return 0;
}
  • 结构体使用
  • 结构体只能被整体初始化,不能被整体赋值
  • struct str x;x = {1,2,3};错误操作
  • c中空结构体是不允许定义的,至少一个成员。在vs中,不同的编译器编译不同gcc 是0.

柔性数组

  • 柔性数组的定义
  • 柔性数组的使用
  • 必须放在结构体内
struct stu {
	int age;
	char name[20];
	int arr[];// 尽量第一个不要使柔性数组,放最后
};

int main()
{
	struct stu* p = malloc(sizeof(struct stu) + sizeof(int) * 10);
	p->age = 16;

	for (int i = 0; i < p->age; i++)
	{
		p->arr[i] = i;
	}


	return 0;
}

联合体union

  • 空间是共享的但是空间大小以最大类型为准。
  • 可以使用点操作符 ,指向操作符
  • 联合体内,起始地址都是一样的
union MyUnion
{
	int a;
	char b;
};

int main()
{
	union MyUnion x ;
	union MyUnion* p = &x;

	p->a;

	return 0;
}


// ---------------------------------------------------------------


union MyUnion
{
	int a;
	char b;
};

int main()
{
	union MyUnion x ;

	printf("%p \n", &x);
	printf("%p \n", &(x.a));
        printf("%p \n", &(x.b));
	// 地址相同 证明联合体按照最大字节变量开辟
        // b永远在a的低地址处
        // 每一个都是第一个元素
        // 从低地址处向高地址开辟空间
	return 0;
}

// ---------------------------------------------------------------

union MyUnion
{
	int a;
	char b;
};

int main()
{
	union MyUnion x ;

	x.a = 16;
	printf("%d",x.b);// 16 小端

	return 0;
}

//-------------------------------------------------------------

union MyUnion
{
	int a;
	char b[4];
}*p,u;

int main()
{
	p = &u;
	p->b[0] = 0x44;
	p->b[1] = 0x45;
	p->b[2] = 0x46;
	p->b[3] = 0x47;

	printf("%x \n", p->a);
	// 47 46 45 44
	return 0;
}

枚举enum

  • 枚举是枚举的常量,常量之间隔开
  • 具有代码的字描述型
  • 现实中有一大批相关的常量需要描述出来

enum color
{
	RED,
	YELLOW,
	BLACK
};

int main()
{
	enum color r = RED;

	return 0;
}

typedef与#define比较

  • 他们两个在处理类型的方面 宏是在预处理时文本替换原则。
  • typedef 类型重命名,形成新的类型时,会有统一的重命名,不是简单的替换。

typedef int* u_int;

int main()
{
	u_int a, b;
	// 类型重命名 后面的全部该改变
	return 0;
}

// -------------------------------------------------------------

#define ptr_t int *

int main()
{
	ptr_t a, b;
	// 这里是替换
	return 0;
}