union与enum

共同体(联合)union
定义--在内存中的存储形态
特点
覆盖技术
系统采用覆盖技术,实现变量的内存共享。所以在某一时刻,存放的和起作用的是最后一次存放的成员值
地址共享--联合所有的变量都共享一个内存,它们的首地址是一样的;

三不:
--不能初始化共同体,所有变量共享一块空间,不能全部初始化;
--不能作为函数的参数,不知道传谁
--不能作为函数的返回值  不知道返回哪个值

作用:主要做类型的转换;

#include <stdio.h>
union book{
	
	char a;
	double price;
	int num;
	
};

int main()
{
	union book b;
	union book *p1; //定义了union book这样的一个类型;指向的是union book这样的一个对象;
	char *pp=NULL;
	p1=&b;
	
	p1->price=123;
	p1->a='a';
	p1->num=2;

	b.a='b';
	b.num=769;
	//769这个数字是有它的意义的,它的二进制为:0000 0011  0000 0001,低字节的第一个字节为1,第二个为3;
	
	//uniob book b={"sdf",67,89};
	//不能初始化,总共只有四个字节,不能初始化这么多数;总共的大小就个字节;
	//不能作为函数的参数;不知道传那个;
	//不能作为函数的返回值;不知道具体的返回哪个;
	pp=(char *)&b;
	pp++;				//指向空间的第二个字节数;
	printf("%d\n",*pp); //我只引用一个字节大小的空间(第二个字节);3
	printf("%d\n",sizeof(union book)); //8  为sizeof(double)=8;
	printf("%d\n",b.price); //769
	
	printf("%p\n",&b.a);    //0012ff44  首地址都一样;
	printf("%p\n",&b.num); //0012ff44
	printf("%p\n",&b.price);//0012ff44
	
	printf("%d\n",b.a);  //1
	printf("%d\n",b.num); //769
	printf("%d\n",b.price); //769
	printf("sdfsf");
	
	return 0;
}


枚举 enum

枚举枚举就是常量数组
定义---enum weekdays {Sun,Mon,Wed,Thu,Fri,Sat};
使用---默认值
枚举定义完:默认值是从0 开始的;
改变以后下一个元素的值是前一个元素值+1
可以批量的改变数据的值,自动+1;
如果需要从N开始,后面的变量一次+1;
这里枚举给我们提供了方便;


#include <stdio.h>
#define AA 0
#define B 1
#define C 2

enum YY{x=100,y=1000,z};  //类似于一堆宏;
int main()
{
	int a[3] ={1,2,3};
	int *p=a+1;
	float *pp=(float *)3;
	int *ppp=3; //输出会崩溃;
	
	AA;  //0
	B;   //1
	C;   //2
	printf("%d\n",*p); //2
	p++;
	printf("%d\n",*p);  //3
	printf("%d\n",(int)ppp); //会崩溃,用3给指针初始化,是直接把数字3转换为地址,这个地址是不允许输出的,这里涉及到类型的转换,总是把=右边的转换为=号左边的类型,然后再赋值;
	
	
	printf("%d\n",x); //100
	printf("%d\n",y); //1000
	printf("%d\n",z); //1001
	
	return 0;
} 



本人愚钝,领悟至此,颇有感慨,与己共勉,陋文浅显,见者海涵。


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值