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個位元組。