联合类型和typedef关键字
一、联合类型
1)对联合的理解:
联合,我们可以将其看成一种:可选择数据类型,一个联合模板虽然有很多成员,但是一个联合只能表示一种单一的数据类型。
#include <stdio.h>
union names
{
int ma;
double games;
char datas;
};//和结构模板的声明相同,联合模板的声明最好放在主函数外面。
int main(void)
{
union names hold={88};
printf("print hold :%d\n",hold.ma);
return 0;
}
打印结果如下:
print hold :88
1.联合变量的选择性
上面的代码中,names这个联合模板有三个可选项,可以选择int型变量ma,那么将隐藏games 和datas 这两个变量,也可以选择double型变量games,那么将隐藏ma 和datas 这两个变量,也可以选择char型变量datas,那么将隐藏 ma 和 games这两个变量。
2.联合变量成员的访问
在初始化中,初始化了联合模板中的第一个成员,因此现在这个联合变量hold选择的就是int型变量ma,也就意味着隐藏掉了games和datas这两个变量,所以可以访问这个联合模板中的成员:使用点运算符(联合变量名)或者间接成员运算符(指向联合变量的指针)
点运算符
//联合变量的访问
#include <stdio.h>
union names
{
int ma;
double games;
};
int main(void)
{
union names hold={80};//将第一个成员初始化为80,并选择它。
printf("print the hold :%d\n",hold.ma);//使用点运算符进行成员访问
return 0;
}
间接成员运算符
//联合变量的访问
#include <stdio.h>
union names
{
int ma;
double games;
};
int main(void)
{
union names hold;
union names *ptu=&hold;//hold是变量,因此要取地址。
hold.games=3.45;
printf("print the hold :%.2f\n",ptu->games);
return 0;
}
3.联合变量的大小
由于联合变量只能表示一个数据类型,因此联合模板所表示的大小就是联合模板的成员中数据类型最大的大小。上面代码中,联合模板成员中大小最大的数据类型是double,因此联合模板的大小就是double类型的大小。
2)对联合变量初始化
注意:初始化哪个成员,意味着联合变量选择了哪个成员。
1.初始化联合变量中的第一个成员:
#include <stdio.h>
union names
{
int ma;
double games;
char datas;
};
int main(void)
{
union names hold={88};//这样做只能初始化第一个成员,也就选择了第一个成员。
printf("print hold :%d\n",hold.ma);
return 0;
}
2.用相同联合模板的变量进行初始化:
//联合变量初始化
#include <stdio.h>
union names
{
int ma;
double games;
char datas[30];
};
int main(void)
{
union names hold={3};
union names bugs=hold;//现在bugs也选择了和hold一样的成员,并且数值相等。
printf("print the bugs :%d\n",bugs.ma);
return 0;
}
3.指定成员初始化:
//指定联合变量的成员进行初始化
#include <stdio.h>
union names
{
int ma;
double games;
char datas[30];
};
int main(void)
{
union names hold={.datas="I love Micy very much!"};//指定第三个成员进行初始化,也就意味着hold选择了第三个成员
printf("print the hold :%s\n",hold.datas);
return 0;
}
打印结果如下:
print the hold :I love Micy very much!
3)对联合变量进行赋值
注意事项:对联合变量中农的哪个成员进行赋值,意味着这个联合变量选择了哪个成员。
有两种方法来对联合变量进行赋值。
1.指定成员进行赋值:
//对联合变量的第一个成员进行赋值
#include <stdio.h>
union names
{
int ma;
double games;
char datas[30];
};
int main(void)
{
union names hold;
hold.games=4.6;
printf("print the hold :%.2f\n",hold.games);
return 0;
}
打印结果:
print the hold :4.60
2.用相同联合模板的联合变量进行赋值:
//联合变量进行赋值
#include <stdio.h>
#include <string.h>
union names
{
int ma;
double games;
char datas[30];
};
int main(void)
{
union names hold;
fgets(hold.datas,30,stdin);//对字符串数组进行整体赋值只能采用标准输入函数进行。
int length = strlen(hold.datas);
if (hold.datas[length-1] == '\n')
{
hold.datas[length-1]='\0';
}
else
{
while (getchar() != '\n')
{
continue;
}
}
union names vota;
vota=hold;//现在相当于,vota也选择了datas这个字符串数组,并且字符串和hold相同。
printf("print the vota :%s\n",vota.datas);
return 0;
}
打印结果:
I love Micy very much!
print the vota :I love Micy very much!
4)在结构中使用匿名联合:
一般来说,在结构中使用联合作为结构的成员,使用匿名联合可以省去设置联合变量。
//在结构中使用匿名联合
#include <stdio.h>
union names
{
int ma;
double games;
};
struct dins
{
int jjr;
union
{
int ma;
double games;
};
double bbq;
};
int main(void)
{
struct dins kong=
{
2,
3,//在匿名联合中,初始化为3,也就意味着选择了ma这个整数类型。
4.3,
};
printf("print the jjr :%d\n",kong.jjr);
printf("print the ma :%d\n",kong.ma);
printf("print the bbq :%.2f\n",kong.bbq);
//现在这个结构变量kong中有三个成员 jjr ma bbq
return 0;
}
打印结果:
print the jjr :2
print the ma :3
print the games :0.00
二、typedef关键字
1.typedef关键字是自定义数据类型关键字。
2.可以将复杂的数据类型自定义成想定义的名称。
3.一般来说,自定义名称用大写表示,这样可以使代码更具可读性。
4.typedef定义的数据类型,如果定义在外部,则这个数据类型具有文件作用域(整个翻译单元都能使用);如果定义在函数内部,则这个数据类型具有块作用域,只能在该函数中使用。
5.一般情况下,用#define来定义宏(常量)用typedef来定义数据类型。
//typedef关键字的使用
#include <stdio.h>
typedef unsigned long KFC;//自定义一个KFC的数据类型,这个数据类型实际上是unsigned long型。
//KFC是具有文件作用域的数据类型
void read_(void);
int main(void)
{
typedef double MOOC;//具有块作用域的数据类型
MOOC dates=67.5;
KFC names=88890;
printf("print the value of the names :%lu\n",names);
printf("print the value of the dates :%.2f\n",dates);
read_();
return 0;
}
void read_(void)
{
KFC comments=899033;
printf("print the value :%lu\n",comments);
return;
}
打印结果:
print the value of the names :88890
print the value of the dates :67.50
print the value :899033

浙公网安备 33010602011771号