共同体(联合)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 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;
}
本人愚钝,领悟至此,颇有感慨,与己共勉,陋文浅显,见者海涵。