C語(yǔ)言基礎(chǔ)及指針⑨聯(lián)合體與枚舉

接續(xù)上篇C語(yǔ)言基礎(chǔ)及指針⑧文件IO

在上篇中 剩晴, 我們初步了解了C語(yǔ)言的IO操作 , 編寫(xiě)IO操作的大致流程:

文件IO編寫(xiě)步驟:

1.使用fopen函數(shù) 锁荔, 得到文件指針
2.指定fopen的操作模式r,w (指定輸入輸出流)
3.創(chuàng)建緩沖區(qū) 瞎领, 緩存讀寫(xiě)數(shù)據(jù)(將流數(shù)據(jù)讀入到內(nèi)存或?qū)懭氲酱疟P(pán))
3.關(guān)閉流 (關(guān)閉文件流)

接著介紹了文件的加密解密 , 文件的存儲(chǔ)都是以二進(jìn)制保存在磁盤(pán)上的 勇劣, 所以我們可以通過(guò)二進(jìn)制運(yùn)算來(lái)進(jìn)行文件的加密解密操作 靖避。在C語(yǔ)言的IO函數(shù)中 潭枣, 沒(méi)有直接獲取文件大小的函數(shù) , 所以我們需要自己通過(guò)文件指針來(lái)獲取文件的大谢媚蟆:

/*獲取文件大小*/
void getFileSize() {

    char* path = "E:\\android_pdf\\研磨設(shè)計(jì)模式.pdf";
    // 打開(kāi)文件
    FILE* fp = fopen(path, "r");
    if (fp == NULL) {
        printf("打開(kāi)文件失敗\n");
        return;
    }

    // 重新定位文件指針 , SEEK_END文件末尾盆犁,0是文件指針的偏移量
    fseek(fp, 0l, SEEK_END);
    // 返回當(dāng)前的文件指針,相對(duì)于文件開(kāi)頭的位移量
    long fileSize = ftell(fp);

    printf("文件大写劬拧:%ld M\n", fileSize / 1024 / 1024);

}

在jni.h中 谐岁, 我們可以看到這樣一段代碼:

typedef union jvalue {
    jboolean    z;
    jbyte       b;
    jchar       c;
    jshort      s;
    jint        i;
    jlong       j;
    jfloat      f;
    jdouble     d;
    jobject     l;
} jvalue;

這樣C語(yǔ)言中的聯(lián)合體 , 那么什么是聯(lián)合體呢 瓮下?

聯(lián)合體:不同類(lèi)型的變量共用一段內(nèi)存(相互覆蓋) 翰铡, 始終只有一個(gè)成員存在 , 最后賦值的那個(gè) 讽坏, 有利于節(jié)省內(nèi)存锭魔。
聯(lián)合體大小:成員中最大的成員所占的字節(jié)數(shù)

聯(lián)合體 路呜, 將不同的類(lèi)型聯(lián)合起來(lái) 迷捧, 組成一個(gè)新的聚合類(lèi)型 , 這個(gè)類(lèi)型可以是聯(lián)合體中的任意類(lèi)型 胀葱。

/*聯(lián)合體*/
/*
    不同類(lèi)型的變量共用一段內(nèi)存(相互覆蓋) 漠秋, 始終只有一個(gè)成員存在 , 最后賦值的那個(gè) 抵屿, 有利于節(jié)省內(nèi)存
    聯(lián)合體大星旖酢:成員中最大的成員所占的字節(jié)數(shù)
*/
union mValue
{
    int     i;
    short   s;
    long    l;
    float   f;

};

/*聯(lián)合體示例*/
void useUnion() {
    union mValue m;
    m.f = 23.4f;
    m.i = 100;  // 最后一次賦值有效

    printf("聯(lián)合體:\n%f - %d\n", m.f, m.i);
}

在java中 , 當(dāng)我們需要一個(gè)類(lèi)列舉幾個(gè)狀態(tài)時(shí) 轧葛, 因?yàn)闋顟B(tài)是固定的 搂抒, 所以我們通常的做法是使用枚舉 , 將狀態(tài)列舉出來(lái) 尿扯, 在C語(yǔ)言也有枚舉這個(gè)類(lèi)型:

/*
    枚舉(列舉所有的情況)
    限定值求晶,保證取值的安全性
*/
enum NetStatus {
    NET_SUCEESS,
    NET_ERROR,
    NOT_NET,
    NET_FAILURE
};

下面我們來(lái)看一個(gè)示例 , 來(lái)大致了解一下枚舉的使用場(chǎng)景:

/*枚舉*/
/*
    枚舉(列舉所有的情況)
    限定值衷笋,保證取值的安全性
*/
enum NetStatus {
    NET_SUCEESS,
    NET_ERROR,
    NOT_NET,
    NET_FAILURE
};

/*模擬網(wǎng)絡(luò)請(qǐng)求*/
void requestHttp(char* url, void(*callBack)(enum NetStatus status,char* res)) {
    printf("請(qǐng)求地址:%s\n", url);
    printf("請(qǐng)求網(wǎng)絡(luò)....\n");
    Sleep(2000);
    enum NetStatus status = NET_SUCEESS;
    char* res = "如果 愛(ài)情是一場(chǎng)花火 ,一閃即逝的花火,我也要去追求\n";
    callBack(status, res);
}

/*網(wǎng)絡(luò)回調(diào)函數(shù)*/
void callBackHttp(enum NetStatus status, char* res) {
    switch (status)
    {
    case NET_SUCEESS:
        printf("網(wǎng)絡(luò)數(shù)據(jù):\n%s", res);
        break;
    case NET_ERROR:
        printf("請(qǐng)求網(wǎng)絡(luò)錯(cuò)誤\n");
        break;
    case NOT_NET:
        printf("沒(méi)有網(wǎng)絡(luò)\n");
        break;
    case NET_FAILURE:
        printf("請(qǐng)求網(wǎng)絡(luò)失敗\n");
        break;
    default:
        printf("未知錯(cuò)誤\n");
        break;
    }
}

/*枚舉示例*/
void useEnum() {
    enum NetStatus status = NET_FAILURE;

    printf("枚舉中元素的值:%d\n", status);

    char* url = "http://www.zhuyongit.com";
    requestHttp(url, callBackHttp);
}

我們模擬了網(wǎng)絡(luò)請(qǐng)求的幾種情況 芳杏, 成功 , 失敗 辟宗, 錯(cuò)誤等等 爵赵, 通過(guò)枚舉將這些情況列舉出來(lái) ,然后通過(guò)網(wǎng)絡(luò)回調(diào)函數(shù)傳遞到網(wǎng)絡(luò)處理函數(shù) 慢蜓, 通過(guò)switch分支語(yǔ)句來(lái)進(jìn)行不同網(wǎng)絡(luò)狀態(tài)的判斷 亚再。

在jni.h頭文件中 , 我們也可以見(jiàn)到類(lèi)似的應(yīng)用:

typedef enum jobjectRefType {
    JNIInvalidRefType = 0,
    JNILocalRefType = 1,
    JNIGlobalRefType = 2,
    JNIWeakGlobalRefType = 3
} jobjectRefType;

使用枚舉來(lái)標(biāo)識(shí)對(duì)象引用的類(lèi)型 晨抡, 本地引用氛悬,全局引用则剃,弱引用,等等 如捅,因?yàn)槲覀冊(cè)谑褂胘ni調(diào)取java對(duì)象的時(shí)候 棍现, java虛擬機(jī)并沒(méi)有將引用數(shù)加1 , 所以我們需要用過(guò)加強(qiáng)引用類(lèi)型 镜遣, 來(lái)保證jni引用的java對(duì)象己肮,不被虛擬機(jī)回收掉 。

在IT的路上 悲关, 山路崎嶇 谎僻, 山崖陡峭 , 自學(xué)如在荊棘滿(mǎn)布的叢林中 寓辱, 披荊斬棘 艘绍, 在渾濁的河流中 , 摸著石頭過(guò)河 秫筏。何以保證我們走的是正確的方向 诱鞠, 長(zhǎng)沙動(dòng)腦學(xué)院 , 老司機(jī)眾多 这敬, 功力深厚 航夺, 開(kāi)車(chē)穩(wěn)當(dāng) , 都是互聯(lián)網(wǎng)老兵 崔涂, 他們是IT路上的探頭燈 阳掐, 幫你指明方向 , 帶你超神 冷蚂, 他們的宗旨是:做一家受人尊敬的企業(yè)锚烦,做一位受人尊敬的老師【動(dòng)腦學(xué)院】。 --- 特約贊助

Android程序員學(xué)C系列:
C語(yǔ)言基礎(chǔ)及指針①
C語(yǔ)言基礎(chǔ)及指針②之指針內(nèi)存分析
C語(yǔ)言基礎(chǔ)及指針③函數(shù)與二級(jí)指針
C語(yǔ)言基礎(chǔ)及指針④函數(shù)指針
C語(yǔ)言基礎(chǔ)及指針⑤動(dòng)態(tài)內(nèi)存分配
C語(yǔ)言基礎(chǔ)及指針⑥字符操作
C語(yǔ)言基礎(chǔ)及指針⑦結(jié)構(gòu)體與指針
C語(yǔ)言基礎(chǔ)及指針⑧文件IO
C語(yǔ)言基礎(chǔ)及指針⑨聯(lián)合體與枚舉
C語(yǔ)言基礎(chǔ)及指針⑩預(yù)編譯及jni.h分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帝雇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛉拙,更是在濱河造成了極大的恐慌尸闸,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孕锄,死亡現(xiàn)場(chǎng)離奇詭異吮廉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)畸肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)宦芦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人轴脐,你說(shuō)我怎么就攤上這事调卑÷丈埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恬涧,是天一觀(guān)的道長(zhǎng)注益。 經(jīng)常有香客問(wèn)我,道長(zhǎng)溯捆,這世上最難降的妖魔是什么丑搔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮提揍,結(jié)果婚禮上啤月,老公的妹妹穿的比我還像新娘。我一直安慰自己劳跃,他們只是感情好谎仲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著售碳,像睡著了一般强重。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贸人,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天间景,我揣著相機(jī)與錄音,去河邊找鬼艺智。 笑死倘要,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的十拣。 我是一名探鬼主播封拧,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夭问!你這毒婦竟也來(lái)了泽西?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缰趋,失蹤者是張志新(化名)和其女友劉穎捧杉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秘血,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡味抖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灰粮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仔涩。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粘舟,靈堂內(nèi)的尸體忽然破棺而出熔脂,到底是詐尸還是另有隱情佩研,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布锤悄,位于F島的核電站韧骗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏零聚。R本人自食惡果不足惜袍暴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隶症。 院中可真熱鬧政模,春花似錦、人聲如沸蚂会。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胁住。三九已至趁猴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彪见,已是汗流浹背儡司。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留余指,地道東北人捕犬。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酵镜,于是被迫代替她去往敵國(guó)和親碉碉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容