国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C > 正文

關于《C和指針》的學習筆記

2020-01-26 16:18:12
字體:
來源:轉載
供稿:網友

  有了之前的基礎,此文只是把一些以前沒有注意到的和值得學習的知識做一個記錄。

第一章

  作者認為使用#if 0 .... #endif比用/*和*/好,因為后者不能嵌套。但是對于//并沒有說明。

第二章  

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

復制代碼 代碼如下:

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

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

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


  對于嵌套較深的函數,作者建議把它分成幾個函數來實現,不至于使用Tab縮進過多。

第三章  數據

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

 

第五章  操作符和表達式

  移位操作,當移動的位數為負值時,具體的結果與編譯器有關或者是未定義的,比如a<<-5可能是左移27位。

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

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

  訪問指向結構的指針的成員時只用->。

 

第六章  指針

  未初始化的指針會導致錯誤。int *a; *a = 12,這使a指向的地址的內容被修改,結果是無法預料的。

  作者認為在諸如搜索元素而未找到時返回值為NULL指針雖然是C的常用技巧,但違背了軟件工程的原則:“用一個單一的值表示兩種不同的意思是件危險的事,因為將來很容易無法弄清哪個才是它的真正用意”。安全的策略是返回兩個值,表示是否成功的狀態值和查找成功時所查找到的元素值。

 

第七章  函數

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

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

復制代碼 代碼如下:

Fibonacci的迭代實現

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;
}


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

#include <stdarg.h>

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

    /*準備訪問可變參數*/
    va_start( var_arg, n_values) ;

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

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


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

 

第八章  數組

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

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

復制代碼 代碼如下:

/* 使用數組 */
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;


  數組特別是龐大的數組的初始化時間可能非??捎^,因此當數組的初始化局部于一個函數或代碼塊時,應當考慮程序每次都對其進行重新初始化是否值得。若否,把數組聲明為static。

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

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

 

第九章  字符串、字符和字節

   無符號數的謹慎使用:strlen返回無符號數,因此if(strlen(x) - strlen(y)>=0) ...永遠是真。這種情況下應該寫為if(strlen(x)>=strlen(y)) ...或者采用強制類型轉換把其轉為int。

  strtok保存它所處理的函數的局部狀態信息,因此不能用它同時解析兩個字符串。

  字符串函數遇到NULL字節結束操作,想要處理非字符串數據時不受到這個限制,可以使用另一組相關的函數:memcpy、memmove、memcmp、memchr、memset。

 

第十章  結構和聯合

  參數為結構的函數,傳遞指針比傳值調用更高效,這是因為后者需要建立一份結構的拷貝。f(type_struct *s){s->x};調用即為f(&s)。如果對這個結構的成員訪問次數超過3次,聲明為寄存器變量會更加有效。為了避免不適當的修改,可以把參數聲明為const,將返回值賦給原結構(或它的一個成員)。

  位段只是進行了簡單的了解,它是一種指定了成員長度的特殊結構。

 

第十三章  高級指針話題

  回調函數的使用可以解決類似于比較不明類型數據的問題,這里也是第一次系統地認識回調函數。

 

第十四章  預處理器

  消除多重包含的危險的方法,在每個頭文件寫入以下內容:

復制代碼 代碼如下:

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

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

 

第十五章  輸入/輸出函數

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

  ungetc把先前讀入的字符返回到流中,使它可以以后被重新讀入。《C程序設計語言》上有一個字符處理的例子用到了它,在此復習一下。當fseek、fsetpos或rewind改變流的位置時,所有退回的字符都將被丟棄。

  gets和puts與fgets和fputs的區別在于,gets讀取一行輸入時,并不在緩沖區存儲結尾的換行符,puts寫入一個字符串時,它在字符串寫入后向輸出再添加一個換行符。另外gets不判斷緩沖區長度,而這會造成危險。

  feof判斷流是否處于文件尾,ferror報告流的錯誤狀態,clearerr對指定流的錯誤標志進行重置。

  tmpfile創建一個臨時文件保存數據,程序結束時就被刪除。臨時文件的名字由tmpnam創建。

 

第十六章  標準函數庫

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

  vprintf、vfprintf、vsprintf用于打印可變參數列表,功能類似于對應的prinft等函數,但參數是一個可變參數列表arg。

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

  locale是一組特定的參數,每個國家可能不同,目的是增強C的世界范圍內的通用性,不詳細記述。

 

  對于十七章經典抽象數據類型和第十八章運行時環境,前者已經比較熟悉,后者與匯編結合緊密,只是粗略瀏覽了一下,這本書姑且算是看完了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
www.亚洲视频| 国产成人久久精品77777| 老司机在线视频二区| 天天爱天天做色综合| аⅴ成人天堂中文在线| 九色成人在线| 中文字幕在线视频免费观看| 青青久草在线| 自拍亚洲国产| 91久久精品国产性色| 国产亚洲精品久久久久久青梅| 2021av天天| 992tv在线观看在线播放| 亚洲精品视频在线免费| 国产老肥熟xxxx在线观看| 国产黄色在线免费观看| 欧美亚洲天堂| 在线中文资源天堂| 国产女人在线观看| 国产视频一二区| 操人视频91| 国产成人精品实拍在线| 久热免费视频| 亚洲综合色视频在线观看| 丁香花视频在线观看| 国产成人亚洲精品播放器下载| 欧洲有码在线视频| 精品全国在线一区二区| 中文字幕在线观看日本| 亚洲激情丁香| 国产黄色片在线观看| 国产在线色视频| av网站在线播放| 国产成人精品18| 国产精品日日爱| 中文字幕在线资源| 国产女人在线观看| 欧美日韩不卡中文字幕在线| 国产成人精品综合网站| 国产精品视频一区二区图片| 国产一级在线观看www色| 国产精品一区二区三区四区色| 国产三级在线免费观看| 尤物视频在线看| 免费高清av| 黄色av免费在线| 亚洲人av在线| 日本亚洲欧美| 久草视频国产| 久久亚洲国产成人亚| 国产精品一区二区三区四区色| 天天av天天爱| 精品极品三级久久久久| 天天操夜夜添| 国产永久免费高清在线观看| 国产鲁鲁视频在线观看免费| 国产色婷婷在线| 国产精品18久久久久网站| 91xx在线观看| 超碰国产在线| 天堂中文在线视频| 国产精彩视频在线观看免费蜜芽| 国产精品被窝福利一区 | 最近久乱中文字幕| 国产极品视频| 日本不卡影院| 国产精品69一区二区三区| 亚洲男人网站| 最近免费中文字幕在线第一页| 99re热视频在线| 牛牛在线精品视频| 午夜视频99| 超碰免费在线| 精品久久亚洲一级α| 国产女人在线视频| 日本韩国精品一区二区| 国产精品麻豆一区二区三区| 亚洲第一成年免费网站| 国产精品日日爱| 国产免费人人看| 日本高清中文字幕在线| 中文在线视频观看| 最近中文av字幕在线中文| av网址在线免费观看| 国产麻豆麻豆| xxx国产精品| 国产成人福利| 国产精彩视频在线观看免费蜜芽| 狠狠色丁香婷婷| 日本成a人片在线观看| 99re热视频在线| 精品欧美色视频网站在线观看| 国产视频1区| 国产深夜福利| 精品一区二区三区在线观看l| 最近中文字幕av免费高清| 黄色毛片在线观看| 国产永久免费| 国产丝袜精品丝袜| 国产香蕉在线| 国产乱人视频免费播放| 成年网在线观看免费观看网址| 亚洲人成电影| 天海翼中文字幕| 欧美性猛交p30| 狠狠狠狠狠狠操| 国产女王在线**视频 | 九九热在线视频观看| 91三级在线| 精品欧美不卡一区二区在线观看| 99久久精品免费观看国产| gogogogo高清视频在线| 欧美黑人乱大交| 黄网站在线观看高清免费| 蜜桃av在线免费观看| 黄色网址在线免费播放| 国产视频中文字幕在线观看| 国产视频青青| www.毛片| 中文字幕在线影院| 国产网友自拍电影在线| 国产黄色免费网站| 伊人色综合网| 激情丁香婷婷| 91欧洲在线视精品在亚洲| 亚洲精品少妇久久久久久| 欧美啪啪精品| 青青青青在线| 国产激情网址| 青青草观看免费视频在线| 久久香蕉一区| 精品女厕厕露p撒尿| 丁香花在线电影| 永久免费不卡在线观看黄网站 | 毛片在线视频| 69国产精品视频| 天天操天天操一操| 在线免费黄色毛片| 中文字幕第一页av| 精品国产一区二区三区不卡在线| 国产在线小视频| 国产性色视频| 中文字幕免费中文| 在线观看视频污| 尤物视频在线观看| 狠狠干五月天| eeuss影院在线观看第一页| 国产精品欧美色图| 国产69精品久久久久孕妇国产69久久| av大片在线| 99综合精品久久| 国产黄色高清在线| 国产中文在线| 国产理论电影在线| 国产女呦网站| 欧美96在线| 色吊丝av中文字幕| 国产精品爱久久久久久久小说| 免费看成年人视频在线观看| 亚洲欧美国产另类首页| 91xx在线观看| 99免费视频| av在线免费观看网| jlzzjlzz欧美大全| www.91av| 国产免费a∨片在线观看不卡| 久久综合第一页| 国产毛片毛片| 国产香蕉免费精品视频| 18加网站在线| √8天堂资源地址中文在线| 国产l精品国产亚洲区在线观看| 国产香蕉视频在线观看| 国产一级免费看| 国产精品欧美色图| 国产91在线视频蝌蚪| 99热播在线观看| 青青国产在线| 国产激情视频在线观看| 天天干天天摸| 国产午夜三区视频在线| 国产高潮av| 欧美激情福利视频在线观看免费| 黄色电影网站在线观看| 国产网红女主播精品视频| 国产国产人免费人成免费视频| 亚洲精品国自产拍在线观看| 免费的黄网站在线观看| 中文字幕视频免费在线观看| 国产夫妻视频| 丁香视频免费观看| 尤物在线精品视频| 中文字幕视频在线观看| 亚洲大香人伊一本线| 国产视频中文字幕在线观看| www.三区| 精品日韩av| 国产午夜三区视频在线| 亚洲激情丁香| 国产福利片在线|