最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于《C和指針》的學(xué)習(xí)筆記

 更新時(shí)間:2013年05月04日 10:42:56   作者:  
本篇文章是對《C和指針》這本書的學(xué)習(xí)做了筆記介紹。需要的朋友參考下

  有了之前的基礎(chǔ),此文只是把一些以前沒有注意到的和值得學(xué)習(xí)的知識做一個(gè)記錄。

第一章

  作者認(rèn)為使用#if 0 .... #endif比用/*和*/好,因?yàn)楹笳卟荒芮短?。但是對?/并沒有說明。

第二章  

  三字母詞,用兩個(gè)問號加一個(gè)符號表示另一個(gè)符號,比較類似于轉(zhuǎn)義字符。查閱了一些資料,它的使用與編譯器有關(guān),了解即可,防止字符串常量被錯(cuò)誤的解釋。

復(fù)制代碼 代碼如下:

??( ==> [   ??< ==> {   ??= ==> # 

??) ==> ]   ??> ==> }   ??/ ==> \ 

??! ==> |   ??' ==> ^    ??- ==> ~ 


  對于嵌套較深的函數(shù),作者建議把它分成幾個(gè)函數(shù)來實(shí)現(xiàn),不至于使用Tab縮進(jìn)過多。

第三章  數(shù)據(jù)

  對于static的復(fù)雜用法,當(dāng)它用于函數(shù)定義或代碼塊之外的變量聲明時(shí),static用于修改標(biāo)識符的連接屬性,從external改為internal,但標(biāo)識符的存儲類型和作用域不受影響。用這種方式聲明的函數(shù)或變量只能在聲明它們的源文件中訪問。當(dāng)它用于代碼塊內(nèi)部的變量聲明時(shí),static用于修改變量的存儲類型,從自動(dòng)變量修改為靜態(tài)變量,但變量的鏈接屬性和作用域不受影響。用這種方式聲明的變量在程序執(zhí)行之前創(chuàng)建,并在程序的整個(gè)執(zhí)行期間一直存在,而不是每次在代碼塊開始執(zhí)行時(shí)創(chuàng)建,在代碼塊執(zhí)行完畢后銷毀。

 

第五章  操作符和表達(dá)式

  移位操作,當(dāng)移動(dòng)的位數(shù)為負(fù)值時(shí),具體的結(jié)果與編譯器有關(guān)或者是未定義的,比如a<<-5可能是左移27位。

  形如a+=1的操作效率比a=a+1高,等價(jià)的a[ 2 * (y - 6*f(x)) ]=a[ 2 * (y- 6*f(x))] + 1與a[ 2 * (y- 6*f(x))] += 1相比,后者不用重復(fù)計(jì)算下標(biāo)。

  sizeof x的形式是允許的。sizeof()并不對表達(dá)式求值,因此sizeof(a=b+1)中的a沒有賦值。

  訪問指向結(jié)構(gòu)的指針的成員時(shí)只用->。

 

第六章  指針

  未初始化的指針會(huì)導(dǎo)致錯(cuò)誤。int *a; *a = 12,這使a指向的地址的內(nèi)容被修改,結(jié)果是無法預(yù)料的。

  作者認(rèn)為在諸如搜索元素而未找到時(shí)返回值為NULL指針雖然是C的常用技巧,但違背了軟件工程的原則:“用一個(gè)單一的值表示兩種不同的意思是件危險(xiǎn)的事,因?yàn)閷砗苋菀谉o法弄清哪個(gè)才是它的真正用意”。安全的策略是返回兩個(gè)值,表示是否成功的狀態(tài)值和查找成功時(shí)所查找到的元素值。

 

第七章  函數(shù)

  無參數(shù)的函數(shù)原型聲明應(yīng)該寫作這樣:int func(void); 目的是不與舊式風(fēng)格聲明混淆。

  遞歸解決問題比非遞歸更為清晰,對于一個(gè)復(fù)雜問題,難以用迭代形式實(shí)現(xiàn)時(shí),遞歸實(shí)現(xiàn)的簡潔性可以補(bǔ)償它所帶來的開銷。Fibonacci是一個(gè)常見的遞歸的例子,但冗余計(jì)算很多,開銷太大,實(shí)際上并不如迭代實(shí)現(xiàn)。

復(fù)制代碼 代碼如下:

Fibonacci的迭代實(shí)現(xiàn)

long fibonacci(int n)
{
    long result;
    long previous_result;
    long next_older_result;

    result = previous_result = 1;

    while( n > 2) {
       n -= 1;
       next_older_result = previous_result;
       previous_result = result;
       result = previous_result + next_older_result;
     }
    return result;
}


  可變參數(shù)列表的使用:頭文件stdarg.h,其中聲明了一個(gè)類型va_list和三個(gè)宏va_start、va_arg、va_end。通過聲明va_list類型的變量與這幾個(gè)宏配合使用,訪問參數(shù)的值。函數(shù)聲明了一個(gè)var_arg的變量用于訪問參數(shù)列表未確定部分,它通過va_start初始化。第1個(gè)參數(shù)是va_list變量的名字,第2個(gè)參數(shù)是省略號前最后一個(gè)有名字的參數(shù)。初始化過程把var_arg變量指向可變參數(shù)部分第1個(gè)參數(shù)。va_arg接受兩個(gè)參數(shù):va_list和參數(shù)列表的下一個(gè)參數(shù)的類型。va_arg返回參數(shù)的值并使var_arg指向下一個(gè)可變參數(shù)。訪問完畢調(diào)用va_end。
復(fù)制代碼 代碼如下:

#include <stdarg.h>

float average( int n_values, ... )
{
    va_list var_arg;
    int count;
    float sum = 0;

    /*準(zhǔn)備訪問可變參數(shù)*/
    va_start( var_arg, n_values) ;

    /*添加取自可變參數(shù)列表的值*/
    for (count = 0; count < n_values; count += 1) {
        sum += va_arg( var_arg, int);
    }

    /*完成處理可變參數(shù)*/
    va_end(var_arg);
    return sum/n_values;
}


  可變參數(shù)的宏并不能判斷參數(shù)數(shù)量和參數(shù)類型,而后者可能會(huì)造成缺省參數(shù)類型的提升。解決這兩個(gè)問題的方法是使用命名參數(shù),也就是可變參數(shù)列表中總有一個(gè)有名字的參數(shù)的原因。

 

第八章  數(shù)組

  int array[10];int *ap =array+2;在這之后,ap[0]在C里是合法的,它等同于array[2],ap[-1]同樣是合法的,即array[1]。

  指針比數(shù)組更有效率的場合:for循環(huán)的ap++比循環(huán)體中的array[a] = 0有效率,前者的乘法計(jì)算只有一次,用于1與數(shù)據(jù)類型長度相乘,而后者每次都需要進(jìn)行計(jì)算。

復(fù)制代碼 代碼如下:

/* 使用數(shù)組 */
int array[10], a;
for ( a = 0 ; a< 10; a +=1 )
    array[a] = 0;

/* 使用指針 */
int array[10], *ap;
for ( ap = array ; ap< array + 10; ap ++ )
    *ap = 0;


  數(shù)組特別是龐大的數(shù)組的初始化時(shí)間可能非常可觀,因此當(dāng)數(shù)組的初始化局部于一個(gè)函數(shù)或代碼塊時(shí),應(yīng)當(dāng)考慮程序每次都對其進(jìn)行重新初始化是否值得。若否,把數(shù)組聲明為static。

  使用指針訪問多維數(shù)組的方法,例如對于數(shù)組int matrix[3][10],聲明int *mp = matrix是錯(cuò)誤的,因?yàn)閙atrix并非一個(gè)指向整型的指針,而是一個(gè)指向整型數(shù)組的指針。int (*p)[10] = matrix是可以的,p指向matrix第一行,實(shí)現(xiàn)對數(shù)組的逐行訪問。如果需要逐個(gè)訪問,則使用int *pi = &matrix[0][0]或int *pi = matrix[0],使它指向第一個(gè)元素。而 int (*p)[] = matrix;是不正確的,它的值根據(jù)空數(shù)組的長度調(diào)整,這一錯(cuò)誤有的編譯器不能捕捉到。函數(shù)傳參數(shù)類似。

  多維數(shù)組顯式初始化,只有第一維能夠推算出,其他維不能省略。

 

第九章  字符串、字符和字節(jié)

   無符號數(shù)的謹(jǐn)慎使用:strlen返回?zé)o符號數(shù),因此if(strlen(x) - strlen(y)>=0) ...永遠(yuǎn)是真。這種情況下應(yīng)該寫為if(strlen(x)>=strlen(y)) ...或者采用強(qiáng)制類型轉(zhuǎn)換把其轉(zhuǎn)為int。

  strtok保存它所處理的函數(shù)的局部狀態(tài)信息,因此不能用它同時(shí)解析兩個(gè)字符串。

  字符串函數(shù)遇到NULL字節(jié)結(jié)束操作,想要處理非字符串?dāng)?shù)據(jù)時(shí)不受到這個(gè)限制,可以使用另一組相關(guān)的函數(shù):memcpy、memmove、memcmp、memchr、memset。

 

第十章  結(jié)構(gòu)和聯(lián)合

  參數(shù)為結(jié)構(gòu)的函數(shù),傳遞指針比傳值調(diào)用更高效,這是因?yàn)楹笳咝枰⒁环萁Y(jié)構(gòu)的拷貝。f(type_struct *s){s->x};調(diào)用即為f(&s)。如果對這個(gè)結(jié)構(gòu)的成員訪問次數(shù)超過3次,聲明為寄存器變量會(huì)更加有效。為了避免不適當(dāng)?shù)男薷?,可以把參?shù)聲明為const,將返回值賦給原結(jié)構(gòu)(或它的一個(gè)成員)。

  位段只是進(jìn)行了簡單的了解,它是一種指定了成員長度的特殊結(jié)構(gòu)。

 

第十三章  高級指針話題

  回調(diào)函數(shù)的使用可以解決類似于比較不明類型數(shù)據(jù)的問題,這里也是第一次系統(tǒng)地認(rèn)識回調(diào)函數(shù)。

 

第十四章  預(yù)處理器

  消除多重包含的危險(xiǎn)的方法,在每個(gè)頭文件寫入以下內(nèi)容:

復(fù)制代碼 代碼如下:

#ifndef _HEADRNAME_H
#define _HEADRNAME_H 1
/* All the stuff that you want in the header file*/
#endif

第一次被包含時(shí)將_HEADRNAME_H定義為1,再次被包含時(shí)將被忽略。即使把它寫做#define _HEADRNAME_H都是可以的。但是仍應(yīng)該盡可能避免多重包含。

 

第十五章  輸入\輸出函數(shù)

  freopen用于打開(或重新打開)一個(gè)特定的文件流,原型:FILE *freopen(char const *filename,char const *mode, FILE *stream),其中最后一個(gè)參數(shù)就是需要打開的流。它首先試圖關(guān)閉這個(gè)流,然后用指定的文件和模式重新打開這個(gè)流,失敗返回NULL,成功返回第三個(gè)參數(shù)。

  ungetc把先前讀入的字符返回到流中,使它可以以后被重新讀入?!禖程序設(shè)計(jì)語言》上有一個(gè)字符處理的例子用到了它,在此復(fù)習(xí)一下。當(dāng)fseek、fsetpos或rewind改變流的位置時(shí),所有退回的字符都將被丟棄。

  gets和puts與fgets和fputs的區(qū)別在于,gets讀取一行輸入時(shí),并不在緩沖區(qū)存儲結(jié)尾的換行符,puts寫入一個(gè)字符串時(shí),它在字符串寫入后向輸出再添加一個(gè)換行符。另外gets不判斷緩沖區(qū)長度,而這會(huì)造成危險(xiǎn)。

  feof判斷流是否處于文件尾,ferror報(bào)告流的錯(cuò)誤狀態(tài),clearerr對指定流的錯(cuò)誤標(biāo)志進(jìn)行重置。

  tmpfile創(chuàng)建一個(gè)臨時(shí)文件保存數(shù)據(jù),程序結(jié)束時(shí)就被刪除。臨時(shí)文件的名字由tmpnam創(chuàng)建。

 

第十六章  標(biāo)準(zhǔn)函數(shù)庫

  volatile是類型修飾符,被設(shè)計(jì)用來修飾被不同線程訪問和修改的變量,阻止編譯器以一種可能修改程序含義的方式“優(yōu)化”程序。

  vprintf、vfprintf、vsprintf用于打印可變參數(shù)列表,功能類似于對應(yīng)的prinft等函數(shù),但參數(shù)是一個(gè)可變參數(shù)列表arg。

  getenv獲取環(huán)境變量,如果找到就用指針返回,否則返回NULL。

  locale是一組特定的參數(shù),每個(gè)國家可能不同,目的是增強(qiáng)C的世界范圍內(nèi)的通用性,不詳細(xì)記述。

 

  對于十七章經(jīng)典抽象數(shù)據(jù)類型和第十八章運(yùn)行時(shí)環(huán)境,前者已經(jīng)比較熟悉,后者與匯編結(jié)合緊密,只是粗略瀏覽了一下,這本書姑且算是看完了。

相關(guān)文章

  • 深入了解C語言冒泡排序優(yōu)解

    深入了解C語言冒泡排序優(yōu)解

    這篇文章主要介紹了C語言冒泡排序法的實(shí)現(xiàn)(升序排序法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • C語言實(shí)現(xiàn)代碼雨效果

    C語言實(shí)現(xiàn)代碼雨效果

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)代碼雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++智能指針的使用

    C++智能指針的使用

    本文主要介紹了C++智能指針的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • C語言函數(shù)棧幀的創(chuàng)建和銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建和銷毀詳解

    這篇文章主要為大家詳細(xì)介紹了C語言函數(shù)棧幀的創(chuàng)建和銷毀,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    一起來學(xué)習(xí)C++的動(dòng)態(tài)內(nèi)存管理

    這篇文章主要為大家詳細(xì)介紹了C++的動(dòng)態(tài)內(nèi)存管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳解_beginthreadex()創(chuàng)建線程

    詳解_beginthreadex()創(chuàng)建線程

    這篇文章主要介紹了詳解_beginthreadex()創(chuàng)建線程,使用_beginthreadex(),需要的頭文件支持#include <process.h> 下面我們就來看看具體的實(shí)現(xiàn)吧
    2022-01-01
  • C++ 學(xué)習(xí)筆記實(shí)戰(zhàn)寫一個(gè)簡單的線程池示例

    C++ 學(xué)習(xí)筆記實(shí)戰(zhàn)寫一個(gè)簡單的線程池示例

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)一個(gè)簡單的線程池學(xué)習(xí)實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C語言實(shí)現(xiàn)病例管理系統(tǒng)

    C語言實(shí)現(xiàn)病例管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)病例管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++示例講解string容器

    C++示例講解string容器

    c++相比c的一個(gè)好處就是實(shí)現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡化,本文重點(diǎn)給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2022-07-07
  • C++函數(shù)重載的細(xì)節(jié)圖文詳解

    C++函數(shù)重載的細(xì)節(jié)圖文詳解

    函數(shù)重載即函數(shù)名相同,函數(shù)形參列表不同(函數(shù)特征標(biāo)不同)的一類函數(shù)稱為函數(shù)重載,下面這篇文章主要給大家介紹了關(guān)于C++函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2022-12-12

最新評論

峡江县| 临汾市| 沁源县| 清远市| 嘉定区| 吉隆县| 密山市| 温州市| 隆回县| 兴安县| 汝阳县| 衡山县| 连云港市| 保康县| 武穴市| 阜新市| 云林县| 玛纳斯县| 佛教| 合江县| 丰城市| 阿拉善盟| 镇远县| 衡山县| 开鲁县| 平乐县| 平山县| 小金县| 辉县市| 舟曲县| 宁远县| 乌恰县| 新蔡县| 嘉义市| 扶绥县| 哈巴河县| 蛟河市| 应城市| 县级市| 霞浦县| 盐津县|