真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C語言學(xué)習(xí)筆記8——構(gòu)造類型-創(chuàng)新互聯(lián)

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)查看詳情吧


文章標(biāo)題:C語言學(xué)習(xí)筆記8——構(gòu)造類型-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://weahome.cn/article/ddhjsi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部