C&C++常用方法笔记 -结构体联合体
结构体 struct
联合体 union
union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。
不过区别也挺明显:
结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。
struct 的命名方式
// 第二种方式,可以直接取名字
// 1. 结构体的定义和使用
// char* 不算基本数据类型
结构体的嵌套
结构体指针和动态内存开辟
// 结构体的数组
// 3. 结构体大小计算(字节对齐)
计算的规则:
1. 按照最大的字节去计算
2. 算得时候只会按照基本数据类型去算
3. 首先会把所有字节数加起来,是否能够整除最大属性的字节数,如果不够为网上累加,一直加到能整除位置
4. 结构体和结构体指针取别名
5定义了一个 联合体
6. 联合体的定义和使用
联合体只能存在一个,要么是 age ,要么是 name
6. 联合体大小计算 (不用累加,取的最大值,最终是否够基本数据类型整除)
C语言中的联合又什么?
联合又称联合体或共用体(union),共用体是通过成员的相互覆盖,是的几个不同的变量共占一段内存,以此大道节省内存的目的。
union
data
{
int
i;
char
c;
float
f;
}
a;
上面的作用是定义联合体,举个例子吧,就像你定义一个整型常量,如
int
b=1
上面的那段代码等同与int,他是告诉系统有这么一个变量,那么接下来就是设置一个常量了,}号后面接着的a就像int
b=1中的b一样,系统这时就会为a这一个变量分配内存空间。
上面的联合体里有3个成员,也就是说有3个变量,A选项就是正确的赋值方式,就像b赋值为1一样,如果你想对具体某个成员赋值的话,就要用到“.”号或
“-”号,通常用“.”。
c语言中的union是什么意思啊?
c语言中的union是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。
声明一个struct类型,为date,有一个实例变量today,如果int的大小占4个字节,第一句输出12,union表示可以有多种方法来看待这个数据类型,里面的的数据是共享内存空间的,大小应该是union中最大的类型,第二句输出8。
所在函数库为【ctype.h】
int isalpha(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)返回非0值,否则返回0
int isalnum(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)或数字(‘0’-‘9’)
返回非0值,否则返回0
int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0
int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)
以上内容参考:百度百科-C语言函数
C语言结构体内嵌联合问题?
联合体里边有三个成员,共享同一段内存,这是联合体的特性。
因为该联合体声明为匿名联合体,所以可以像访问一个外层的结构体变量一样直接访问联合体的成员。举个例子:
sensor a; //定义一个sensor类型的变量a
a.x=1.12; //访问匿名联合体的成员
a.y=2.34; //访问匿名联合体的成员
a.pitch=23.3; //访问匿名结构体的成员
c语言中结构体和共同体及应用不是很明白,试举例说明。
联合体(union)和结构体(struct)的区别
1. 联合说明和联合变量定义
联合也是一种新的数据类型, 它是一种特殊形式的变量。
联合说明和联合变量定义与结构十分相似。其形式为:
union 联合名{
数据类型 成员名;
数据类型 成员名;
…
} 联合变量名;
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。
下例表示说明一个联合a_bc:
union a_bc{
int i;
char mm;
};
再用已说明的联合可定义联合变量。
例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:
union a_bc lgc;
在联合变量lgc中, 整型量i和字符mm公用同一内存位置。
当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。
联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用”-;”符号, 此时联合访问成员可表示成:
联合名-成员名
另外, 联合既可以出现在结构内, 它的成员也可以是结构。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要访问结构变量y[1]中联合x的成员i, 可以写成:
y[1].x.i;
若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
*y[2].x.ch;
若写成”y[2].x.*ch;”是错误的。
2. 结构和联合的区别
结构和联合有下列区别:
1) 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在。
2) 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
下面举一个例了来加对深联合的理解。
main()
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf(“%c%c\n”, number.half.first, mumber.half.second);
number.half.first=’a’; /*联合中结构成员赋值*/
number.half.second=’b’;
printf(“%x\n”, number.i);
getch();
}
输出结果为:
AB
6261
从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。
帮忙修改下代码!C语言结构体和联合体
一个一个来回答:
一 可以改成这样子,因为给结构体的子项赋值就是这么做的啊–取子项的起始地址然后输入数据,但是”%s,%c,%f”这样的输入格式是有问题的,如果我输入的是001,F,13.7,那么p[i].num里存的是”001,F,13.7″,而sex,run中的内容就不确定了,因为scanf接受字符串时以空格或回车为结束标志,所以这一整串都存到num里去了,如果输入的是”001 ,F,13.7″这样num里的数据没问题,但是sex和run中的内容是错误的,我建议你把输入格式改为”%s %c %f”数据之间以空格间隔,这样输入的时候就不会出问题了;还有很重要的一点是scanf的第一个变量,p[i]有问题,p是一个结构体数组的起始地址,p[i]表示的是结构体,而我们需要的是p[i]的地址而非p[i]这个结构体,所以这里在运行的时候会出现内存错误,这里可以改为p[i](可以这样用是因为num是p[i]的第一个子项,它们的起始地址相同),或者p[i].num(num是字符数组的起始地址所以不必要加)
二 显然一中已经指出p[i]是错误的,而p[i]是正确的(通过VC++ 6.0以及DEV C++验证)
三 一中已经指出,这样做是可以的(也验证通过)
myoutput里面当sex==F时
应该printf(“%10.2f\n”,p[i].pick.jump);吧
我把我改后的源代码贴上,你可以运行试试,这些问题都明朗了
#include stdio.h
#include string.h
#define N 3
union sel
{ int body;
float jump;
};
struct student
{ char num[10];
char sex;
float run;
union sel pick;
};
void myinput(struct student *p)
{ int i=0;
float x=0,y=0;
for(i=0;iN;i++)
{ printf(“Input number,sex,100_metre dash score:”);
//scanf(“%s,%c,%f”,p[i],p[i].sex,x);/***1***/
//p[i].run=x;/***2***/
scanf(“%s %c %f”,p[i],p[i].sex,p[i].run);/***3***/
if(p[i].sex==’M’)
{ printf(“Input pull_up score:”);
scanf(“%d”,p[i].pick.body);
}
else if(p[i].sex==’F’)
{ printf(“Input long jump score:”);
//scanf(“%f”,y);/***4***/
//p[i].pick.jump=y;/***5***/
scanf(“%f”,p[i].pick.jump);/***6***/
}
else
{ printf(“Invalid sex,input again:\n”);
i–;
}
}
}
void myoutput(struct student *p)
{ int i=0;
printf(“Sport record:\n”);
printf(“number sex 100_metre pull_up jump\n”);
for(i=0;iN;i++)
{ printf(“%s %C %.2f “,p[i].num,p[i].sex,p[i].run);
if(p[i].sex==’M’)
printf(“%d\n”,p[i].pick.body);
else if(p[i].sex==’F’)
printf(“%10.2f\n”,p[i].pick.jump);
}
}
main()
{ struct student a[N];
myinput(a);
myoutput(a);
}