1.結(jié)構(gòu)體
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的阜陽網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!1)結(jié)構(gòu)體類型描述不占內(nèi)存空間(struct xx{ };整個(gè)部分都是類型描述或者叫變量類型),所以不能在定義結(jié)構(gòu)體時(shí)給結(jié)構(gòu)體成員變量賦值。類似int i;中是i而非int占內(nèi)存空間
2)結(jié)構(gòu)體定義的最后勿忘寫分號“;”
3)結(jié)構(gòu)體定義放在函數(shù)外,防止有些校驗(yàn)嚴(yán)格的編譯器不認(rèn)識這種定義方式
4)結(jié)構(gòu)體變量名也僅僅是結(jié)構(gòu)體的起始位置地址,不能通過變量名引用到結(jié)構(gòu)體的所有成員,這個(gè)和數(shù)組一樣,不能通過數(shù)組名得到所有元素,只能通過遍歷方式實(shí)現(xiàn)。
而字符串指針和字符串賦值的字符數(shù)組可以通過指針變量或者數(shù)組名+%s得到完整字符串,可能是因?yàn)橥ㄟ^輸出格式%s實(shí)現(xiàn)。
但字符賦值的字符數(shù)組無法用%s+數(shù)組名的方式完整輸出。
char* strp = "hello";
char strA[] = "hey";
char strB[2] = {'h', 'i'};
printf("strp = %s\n", strp);
for(i=0; i<5; ++i)
printf("strA[%d] = %c, %d\n",i,strA[i], strA[i]);
printf("strA = %s\n", strA);
for(i=0; i<5; ++i)
printf("strB[%d] = %c, %d\n",i,strB[i], strB[i]);
printf("strB = %s\n", strB);
運(yùn)行結(jié)果:
strp = hello
strA[0] = h, 104
strA[1] = e, 101
strA[2] = y, 121
strA[3] = , 0
strA[4] = ?, -1
strA = hey
strB[0] = h, 104
strB[1] = i, 105
strB[2] = @, 64
strB[3] = , 0
strB[4] = , 0
strB = hi@
5)對結(jié)構(gòu)體部分初始化:struct student_st stu = {.math=98, .Chinese=99};
6) 對結(jié)構(gòu)體成員變量的引用,->等價(jià)于 *( ).;
只區(qū)分結(jié)構(gòu)體變量是一般變量還是指針變量,結(jié)構(gòu)體是一般變量的不管成員是一般變量成員還是指針變量成員都用“.”來引用,結(jié)構(gòu)體是指針變量的不管成員是一般變量成員還是指針變量成員都用
“->”來引用:
struct student
{
int id;
char* name;
int score;
};
struct student std = {.name="xiaoxiao"};
struct student *pstd = &std;
printf("%d, %s, %d\n", std.id, std.name, std.score);
printf("%d, %s, %d\n", pstd->id, pstd->name, pstd->score);
7)結(jié)構(gòu)體數(shù)組賦給相應(yīng)指針,指針每+1或者++是移動到不同的結(jié)構(gòu)體上。
8)嵌套結(jié)構(gòu)體的引用是連續(xù)的“.”或者連續(xù)的“->”
9)結(jié)構(gòu)體內(nèi)存對齊公式:當(dāng)前地址號%sizeof(數(shù)據(jù)類型大小),如果能被整除則放在當(dāng)前地址起始+sizeof(數(shù)據(jù)類型大小)這塊內(nèi)存,否則當(dāng)前地址號+1,直到能被整除。實(shí)際就是之前總結(jié)的三條規(guī)律的第一條:當(dāng)前成員變量起始地址是其數(shù)據(jù)類型大小的整數(shù)倍。
網(wǎng)絡(luò)協(xié)議編程不需要字節(jié)對齊:結(jié)構(gòu)體描述“__attribute__((packet));”
*注意類型描述結(jié)尾沒有分號,后直接跟 “__attribute__((packet))”
10)結(jié)構(gòu)體傳參:
值傳參,直接傳結(jié)構(gòu)體變量相當(dāng)于把結(jié)構(gòu)體中每個(gè)成員變量都傳過去,開銷會很大,所以結(jié)構(gòu)體傳參傳指針
//值傳參
struct simp_st a;
struct simp_st *p = &a;
func(a) -->func(a.i, a.ch, a.f);
func(p) -->func(&a);
11)無名結(jié)構(gòu)體在描述時(shí)就要定義對應(yīng)的變量,否則無法使用
struct?{ }a, *p;
2.共用體:共用體和結(jié)構(gòu)體的描述、定義、引用成員方式、傳參方式方式都相同
1)共用體和結(jié)構(gòu)體嵌套的情況:
struct
{
int i;
char ch;
union
{
int a[10];
float f;
}uni_a; //無頭聯(lián)合體,必須要有變量;結(jié)構(gòu)體亦然
}stru_a;
2)結(jié)構(gòu)體和共用體嵌套的應(yīng)用
計(jì)算32位無符號數(shù)高低16位的和
union
{
struct
{
uint16_t i;
uint16_t j;
}x;
uint32_t y;
}uni_a;
uni_a.y = 0x11223344;
printf("%x\n", uni_a.x.i + uni_a.x.j);
運(yùn)行結(jié)果:4466
3)位域面試相關(guān)
由于輸入的是%d帶符號的整數(shù),所以當(dāng)考慮位域的值時(shí)也要考慮正負(fù)號的問題,當(dāng)本變量在位域中的全部bit是0開頭的就是正數(shù),那么該部分換算為十進(jìn)制值就行;如果變量在位域中的全部bit是1開頭的,說明是個(gè)負(fù)數(shù),由于負(fù)數(shù)的存儲方式是絕對值取反加一,那么逆向計(jì)算就是減一后取反得到的就是負(fù)數(shù)的絕對值,再取負(fù)值即可。
union
{
struct
{
char a:1;
char b:2;
char c:1;
}x;
char y;
}w;
int main()
{
while(1)
{
printf("enter w.y value, enter q to quit\n");
if(1 != scanf("%d", &w.y))
break;
printf("w.x.a=%d\n", w.x.a);
printf("w.x.b=%d\n", w.x.b);
printf("w.x.c=%d\n", w.x.c);
}
exit(0);
}
結(jié)果:
當(dāng)輸入為1,w.x.a = -1;//1~00000001,a是bit:0,求w.x.a,
//那么計(jì)算機(jī)只看這一位和整個(gè)八位
//沒關(guān)系,安裝數(shù)據(jù)存儲規(guī)則有符號數(shù)且最高位為1為負(fù)數(shù),
//將其減一取反的值取負(fù)號,得負(fù)一。
當(dāng)輸入為5,對應(yīng)bit7:0=00000111。w.x.a是bit:7,結(jié)果同上。
w.x.b是bit:1-2也就是11,這兩位是b的全部,雖然只有兩位
也是遵守計(jì)算機(jī)數(shù)據(jù)存儲規(guī)則,最高位為1說明是負(fù)數(shù),
減一取反再取負(fù)值即是b的值為-1
*note:數(shù)據(jù)在計(jì)算機(jī)中都是以補(bǔ)碼存儲的,不管占了幾個(gè)bit位,如果是有符號數(shù),第一位都是符號位,0正1負(fù),按照補(bǔ)碼的運(yùn)算的逆運(yùn)算反推對應(yīng)十進(jìn)制數(shù)字
3.枚舉:
1)枚舉和結(jié)構(gòu)體、共用體/聯(lián)合體的類型描述不一樣:
枚舉成員之間用逗號“,”隔開,共用體結(jié)構(gòu)體成員之間用分號隔開“;”;enum類型描述時(shí)可以直接賦值,共用體/結(jié)構(gòu)體不能在類型描述時(shí)賦值。
2)經(jīng)常被當(dāng)作宏集合使用,里面自動賦值比較方便,而且不同成員值可以一樣
enum
{
SPRING = 1,
SUMMER = 0,
FALL,
WINTER
}en_a;
int main()
{
en_a = FALL;
printf("%d\n", en_a);
exit(0);
}
4.結(jié)構(gòu)體中的自引用指針的數(shù)據(jù)類型別忘記struct
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧