当前位置:首页 » 文件传输 » 结构体嵌套联合体成员访问
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

结构体嵌套联合体成员访问

发布时间: 2022-10-09 06:47:45

A. 结构体内嵌套数组结构体怎么访问

#include<stdio.h>

structa
{
inta1;
chara2;
};

structb
{
structab1;
};

intmain(void)
{
structbstru;
stru.b1.a1=30;
stru.b1.a2='a';
printf("%d%c",stru.b1.a1,stru.b1.a2);/*30a*/
return0;
}

B. c语言结构体内嵌联合问题

联合体里边有三个成员,共享同一段内存,这是联合体的特性。
因为该联合体声明为匿名联合体,所以可以像访问一个外层的结构体变量一样直接访问联合体的成员。举个例子:
sensor a; //定义一个sensor类型的变量a
a.x=1.12; //访问匿名联合体的成员
a.y=2.34; //访问匿名联合体的成员
a.pitch=23.3; //访问匿名结构体的成员

C. 这段程序,C中联合体嵌套结构体,怎么分析。

在这个union中,int a和int b,in.x 这三个其实是同一个
e.a=1; //执行后 a和b都是1
e.b=2; //执行后 a和b都是2
e.in.x=e.a*e.b; //执行后 x是4,所以a和b也变成4
e.in.y=e.a+e.b; //执行后 y是8

D. ​这个结构体的嵌套定义怎么理解,我都晕了

三层结构体
最外层定义的是struct ALLOC_HDR 同时命名为ALLOC_HDR
也就是定义 ALLOC_HDR base等同于 struct ALLOC_HDR base
第二层是一个无名结构体 struct{ } s;
这个相当于在外面定义一个
struct temp{ struct ALLOC_HDR *ptr; unsigned int size; } s;
然后 在ALLOC_HDR定义 struct temp s;
在这个程序里面 这个结构体定义放在了ALLOC_HDR里面 同时是没有结构体名字的,只有一个变量s
第三层是在这个无名结构体s里面定义了一个最外层的指针 struct ALLOC_HDR *ptr;
所以如果要访问base上的指针 ptr可以写成
base.s.ptr
这个ptr实质上是ALLOC_HDR *型的 也就是说
base.s.ptr->s.ptr->s.ptr这样的访问是允许的 也是可以无限嵌套下去的

E. C语言中结构体嵌套

struct student
{
char name[20];
int age;
};
typedef struct student STU; //学生

struct class
{
STU students[50];
};
typedef struct class Class; //班

void main(void)
{
STU students[50]={...初始化}; //学生数组
STU .....
Class classes[8]; //班级数组
classes[0].students = students; //初始化班级学生
classes[1].students = ....
......
}

粗略的描述了一下,用指针来做最好!

F. 关于c语言结构体嵌套的问题

早期纯C编译器要求结构体类型必须写上struct关键字,不能只写个结构体名。后来C++兼容的编译器则允许写结构体名就可以了。所以你在嵌套时结构体成员名前写上struct(struct Order order;)就在什么编译器下都能通过了……

G. 结构体struct和联合体union(联合)有什么区别呢

一、结构体struct

各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。

二、联合体union

各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。

代码1:对比struct和union占用内存大小
[code]
#include<stdio.h>
//结构体
struct u //u表示结构体类型名
{
char a; //a表示结构体成员名
int b;
short c;
}U1;
//U1表示结构体变量名
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符

//联合体
union u1 //u1表示联合体类型名
{
char a; //a表示联合体成员名
int b;
short c;
}U2;
//U2表示联合体变量名
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符

//主函数
int main(){
printf("%d\n",sizeof(U1));
printf("%d\n",sizeof(U2));
return 0;
}

/*程序运行结果是:
12
4*/
[/code]

所有成员共用一块存储空间,在操作不同的成员时,编译器根据不同的成员类型,按照不同的方式取值。

#include<stdio.h>

//联合体
union u1
{
char a;
int b;
short c;
}U2;

//主函数
int main(){
U2.a='a';
printf("%c%c\n",U2.b,U2.c);//输出aa
U2.a='b';
printf("%c%c\n",U2.b,U2.c);//输出bb
U2.b=0x4241;
printf("%c%c\n",U2.a,U2.c);//输出AA
return 0;
}
代码3:union大小计算

union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍

代码中U3至少容纳最大e[5]=20字节,同时变量类型最大值是整数倍,即使double(字节数是8)的整数倍,因而sizeof(U3)=24。

#include<stdio.h>

//联合体
union u2
{
char a;
int b;
short c;
double d;
int e[5];
}U3;

//主函数
int main(){
printf("%d\n",sizeof(U3));//输出24
return 0;
}
代码4:union大小端模式

#include<stdio.h>

//联合体
union u3
{
char c[4];
int i;
}U4;

//主函数
int main(){
U4.C[0]=0X04;
U4.C[1]=0X03;
U4.C[2]=0X02;
U4.C[3]=0X11;
printf("%x\n",U4.i);//输出为11020304 小端
return 0;
}
代码5:struct字节对齐

U5中a四个字节,后面b和c加起来3个字节,正好补1个字节对齐;U6中b1个字节,要和后面的a对齐,需要补3个字节对齐,c也要补1个字节对齐,因而最终U6为12个字节。另外,要想改变这种默认对齐设置,可以用

#pragma pack (2) /*指定按2字节对齐*/

#pragma pack () /*取消指定对齐,恢复缺省对齐*/

#include<stdio.h>

//联合体
struct u4
{
int a;
char b;
short c;
}U5;

struct u5
{
char b;
int a;
short c;
}U6;

//主函数
int main(){
printf("%d\n",sizeof(U5));
printf("%d\n",sizeof(U6));
return 0;
}

//输出为
//8
//12

H. 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 的低八位和高八位。

I. 结构体嵌套联合体字节对齐问题

你这20是16进制吧,这应该是32个字节啊。内存如下
1x 11xxxx 111111111xxxxxxx 1111xxxx (x代表填充位)
需要注意union的字节,union 是按照最大字节类型来对齐(注意是 最大类型的字节,不是总字节)。因此union是按照double 8字节对齐的。而union存在char a[9]。也就是需要9个字节来存储即可,但是!C对内存有 这样的要求:所占内存大小必须是最大类型字节的整数倍,union中最大类型是double 8字节(数组不是类型!!)。因此union需要大于等于 9 同时又是8的倍数。因此就占16个字节。
最好还要注意struct里面最大类型也是double。而不是int。因此最后还要加上4个填充位来变为8个整数倍。

J. c语言中结构体与共用体的嵌套

共用体,顾名思义,就是所有的成员公用一段存储空间。
t.c='a';此时,t.i的值也是‘a’,也就是‘a’的ascii码值65.
t.i=1;此时,t.c的值也是1,覆盖了原先的65。.
int类型占用的字节数根据不同的编译器而不同,一般是2个字节。