萌新的學(xué)習(xí)筆記,寫錯了懇請斧正。
目錄
結(jié)構(gòu)體(聯(lián)合體)嵌套
嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)不創(chuàng)建變量(匿名)
嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)創(chuàng)建變量(非匿名)
嵌套初始化
柔性數(shù)組
柔性數(shù)組的使用
結(jié)構(gòu)體(聯(lián)合體)嵌套
結(jié)構(gòu)體、聯(lián)合體可以嵌套,也就是說結(jié)構(gòu)體(聯(lián)合體)的成員也可以是結(jié)構(gòu)體(聯(lián)合體)
嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)不創(chuàng)建變量(匿名)
如果嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)不創(chuàng)建變量(匿名),內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)的成員會被認(rèn)為是外圍結(jié)構(gòu)體(聯(lián)合體)的成員,如果外圍結(jié)構(gòu)體(聯(lián)合體)也是匿名的,那么就遞歸應(yīng)用此規(guī)則:
#include <stdio.h>
struct
{
int x;
struct
{
int y;
union
{
int z;
char c;
};
};
} a;
int main()
{
a.z = 1;
printf("%d\n", a.c);
return 0;
}
注意:此匿名非彼匿名,結(jié)構(gòu)體類型依舊可以有名字,但是不能內(nèi)嵌結(jié)構(gòu)體只能有其聲明部分而不能在后面加成員變量名
嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)創(chuàng)建變量(非匿名)
當(dāng)嵌套時內(nèi)嵌結(jié)構(gòu)體(聯(lián)合體)創(chuàng)建變量(非匿名),則需要通過訪問操作符先訪問這個內(nèi)嵌結(jié)構(gòu)體類型的成員,再訪問其中的成員,如果外圍結(jié)構(gòu)體(聯(lián)合體)也是非匿名結(jié)構(gòu)體,那么就遞歸應(yīng)用此規(guī)則:
#include <stdio.h>
struct S1
{
struct S2
{
union U1
{
union U2
{
int n1;
int n2;
} u2;
int n3;
} u1;
int n4;
} s2;
int n5;
} s1;
int main()
{
s1.s2.u1.u2.n1 = 1;
printf("%d\n", s1.s2.u1.n3);
return 0;
}
同樣的,這里的非匿名也與匿名結(jié)構(gòu)體無關(guān),結(jié)構(gòu)體類型也可以沒有命名,但是內(nèi)嵌結(jié)構(gòu)體后面應(yīng)該加成員變量名
嵌套初始化
這邊C官網(wǎng)上講的足夠清楚了,鏈接在此
柔性數(shù)組
在C99標(biāo)準(zhǔn)以后,結(jié)構(gòu)體的最后一個成員被允許是一個未知大小的數(shù)組,這就叫柔性數(shù)組
這個未知大小當(dāng)然不是真的未知,而是“可動態(tài)分配”
比方說:
struct S
{
int i;
long arr[];
};
或者寫成:
struct S
{
int i;
long arr[0];
};
特點:文章來源:http://www.zghlxwxcb.cn/news/detail-782938.html
- 柔性數(shù)組成員前必須至少包含一個其他成員
- 用sizeof返回包含柔性數(shù)組的結(jié)構(gòu)體的大小時,忽略柔性數(shù)組后正常計算
- 包含柔性數(shù)組的結(jié)構(gòu)體不能作為數(shù)組成員或者其他結(jié)構(gòu)體的成員
- 如果創(chuàng)建包含柔性數(shù)組的結(jié)構(gòu)體變量最好使用動態(tài)內(nèi)存分配(見下)
柔性數(shù)組的使用
如下便是給柔性數(shù)組分配了40個長整型的空間文章來源地址http://www.zghlxwxcb.cn/news/detail-782938.html
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int i;
long arr[];
} stt;
int main()
{
stt* p = (stt*)malloc(sizeof(stt) + 40 * sizeof(long));
if (p == NULL)
{
perror("malloc-p");
exit(EXIT_FAILURE);
}
p->i = 40;
for (int i = 0; i < 40; i++)
p->arr[i] = i + 1;
for (int i = 0; i < 40; i++)
printf("%2ld\t", (*p).arr[i]);
free(p);
p = NULL;
return 0;
}
到了這里,關(guān)于椋鳥C語言筆記#31:結(jié)構(gòu)體(聯(lián)合體)嵌套、柔性數(shù)組的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!