<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C語言掃盲及深化學習

      c語言特點:
      (1)效率高
      (2)控制性強
      (3)硬件親和性好
      (4)可移植性高

      一、關于注釋

        c語言中注釋不能嵌套,因此注釋代碼時一定要注意源代碼中是否已經存在注釋。要從邏輯上刪除一段代碼,利用預編譯指令更加安全有效,其格式為:

      if 0

         statment;
      #endif
      

      二、關于函數參數

        如果函數參數帶有const,則表示函數將不會改變調用者傳遞的參數。

      三、關于傳址和傳值

        在c語言中,標量和常量是按值傳遞,而數組是傳址調用,傳值會有臨時拷貝,被調函數內部修改該參數對調用函數來說是無效的。所有傳遞給函數的參數都是按值傳遞的,但是數組是按引用傳遞。

      四、關于c語言的編譯鏈接過程

        源碼 -> 編譯(預處理 + 解析語義 .o文件,即目標代碼)-> 鏈接(目標文件 + 庫文件) -> 可執行文件

        可執行文件的運行,會綁定一個啟動程序,用于處理一些其他事項。

      五、關于鏈接屬性

        鏈接屬性的作用:標識符的鏈接屬性決定如何處理在不同文件中出現的標識符,標識符的作用域與連接屬性有關。

      簡單的講,當有多個源文件時,鏈接屬性可以更好的處理所有文件之中的標識符變量,尤其是多個文件中出現的同一個標識符,使程序結構更明晰。

        鏈接屬性的類型(以文件為維度):external->文件外部可訪問;internal -> 只能在文件內部訪問
        鏈接屬性對應的關鍵字:extern 和static,extern表示可訪問其他文件中相同的標識符(包括函數和變量),比如可以在file1中定義int a;然后在file2中聲明 extern int a;則表示的是file2中的變量a是引用file1中的變量a,也就是說這兩個文件中的a是同一個變量。
        一般的,全局變量和函數名的默認鏈接屬性為external,而局部變量默認為internal
        可以用extern和static關鍵字修改默認鏈接屬性,如全局變量 static int a;表示a的連接屬性為文件內部;而static int function()表示函數function的連接屬性為文件內部,即只能在該文件中調用該函數;而對于局部變量extern int b,則表示b為其他文件中定義的變量,即其連接屬性為external。

      注意:static除了以上表示鏈接屬性的用法之外,還有一種用法,就是將static用于局部變量,對于局部變量sttaic int c來說,其不是改變c的鏈接屬性,而是改變c的存儲位置,使得c不再存儲在進程的??臻g中,而是編譯時將局部變量c存儲在進程的.data段(初始化的靜態數據區),因此,在該進程中當下一次訪問變量c時,c的值為最近修改后的值。這就是static常用的三大用法,即修飾全局變量、修飾函數和修飾局部變量。簡單講,static的主要作用就是定位

      六、const和static關鍵字作用總結

        c語言中static三大作用:修飾全局變量、修飾函數和修飾局部變量。當static修飾全局變量和函數時,表示的是鏈接屬性的特征,表示該全局變量或者是函數的鏈接屬性為internal,只有在其所在的文件內可以被訪問與調用;而當static修飾局部變量時,不再表示鏈接屬性的特征,而是表示該局部變量的存儲位置在.data段(初始化的靜態數據區:因為靜態局部變量默認情況下會被編譯器初始化為0)。
      c語言中const常常存在于三種形式:const常量、const與指針和const與形參。const常量就是在一般變量前面加上const修飾,表示該變量不可更改,因此叫做const常量,即給字面值一個名字;const與形參表示的是在函數的聲明中將參數用const來修飾,const修飾的形參表示在函數內部該參數不可被更改,這樣既能表明編程者的意圖,也能防止錯誤;而const與指針的情況比較復雜,因為涉及到指針和其所指代的內容兩個因素,因此,const修飾的是指針還是其所指代的內容,是一個特別容易混淆的點。如下所示作以區分:
      (1)int const *pci
        寫成如上形式,const修飾的是什么呢?有一個簡單的記憶法(首先要求將星號跟隨變量名作為一個書寫習慣,如上述的代碼不應寫成 int* const pci,雖然也沒錯,但是習慣問題),因此const修飾的是*pci,而*pci的語義是指針所指代的內容,所以說該種寫法表示指針可以修改,但是其所指代的內容不可更改。
      (2)int * const pci
        顯而易見,該種寫法const修飾的是pci指針,所以其語義是pci是一個常量指針,指針的值(即所指地址)不可修改;而指針所指代的內容是普通變量,可以修改。
      (3)int const * const pci
        該種寫法就容易理解了,即表示的是指針和其所指代的內容都不可更改。

      對于以上const的技法,有一個口訣:即看*與const的相對位置,右定值,左定向(左右是指*的位置)

      七、關于右值和左值

        在c語言中,所謂左值指的是存儲位置,而右值就是指值。例如:
      a = b + 5;
      其中, a是個左值,因為他標識了一個可以存儲結果值的地點(相當于門牌號),而b + 5 是一個右值,他是一個值(相當于屋內的東西)。
      結論:凡是可以清晰表示地址概念的都可以作為左值,凡是可以清晰表示值的概念的,都可以作為右值。

      八、可變參數列表實現

        c語言可通過stdarg.h中定義的方法實現可變參數列表,這個頭文件聲明了一個va_list的類型和三個宏操作:
      (1)va_start:初始化va_list,將va_list變量設置為指向可變參數部分的第一個參數。
      (2)va_arg:訪問指定參數的值,并且使指針指向下一個可變參數。
      (3)va_end:訪問結束。在訪問最后一個參數后,調用該函數,可變參數訪問結束。
      (4)va_list:用于訪問參數列表的未確定部分

      九、數組與指針的區別

        數組名和指針都具有指針值,都可以進行間接訪問和數組下標訪問,但是,聲明數組和指針時,其內存狀態存在很大的不同,這一點需要重點理解。比如下面的例子:
      int a[5]
      int *b
        聲明a時,編譯器首先為數組a開辟5個int大小的內存空間,然后創建數組名a為常量,并將其指向這段空間的起始內存地址;而聲明指針b時,則只是為指針變量本身開辟一個內存空間,其值可能不會被初始化,不會指向任何有意義的地址空間;但是b++合法,b不合法,而a++不合法(a是常量),a合法。

      十、指向數組的指針

      int matrix[3][10];
      int (*p)[10] = matrix;
      p是一個指針,是一個指向擁有10個整型元素的數組的指針。

      對于多維數組做函數參數的情況來講,要特別注意其函數原型的聲明形式。
      func(int (*p)[10]);
      func(int matrix[][10]);
      以上兩個參數的語義是一樣的,都是指:指向包含10個整型元素的數組的指針,其中,一維以后的數組長度在形參中不可省略;而不能將二維數組的形參聲明為func(int **p),該參數的語義是聲明一個指向整型指針的指針,與指向數組的指針不是一個概念,要特別注意。

      十一、字符串操作函數注意事項(string.h)

      (1)計算字符串長度函數--strlen
      strlen函數的返回值為size_t,其在stddef.h定義為無符號整數,因此使用時可能會出現意想不到的結果,比如無符號整數和0比較,將不會得到正確的結果,因此在使用其返回值時要將其強制轉換為int類型。
      (2)不受限制的字符串函數--strcpy\strcat\strcmp
      這些函數在使用時不會自動檢查目標數組的長度,因此程序員在使用時必須時刻牢記檢查目標數組的長度,以免越界產生不可預想的錯誤。
      (3)長度受限的字符串函數--strncpy\strncat\strncmp
      strncpy:若長度小于dst數組長度,剩余的自動補NUL字符;若長度大于或等于dst長度,此時結果不會以NUL字符結尾。
      strncat:該函數總是在結果字符串后面添加一個NUL字符
      (4)字符串分割函數--strtok
      strtok可以將一個字符數組根據不同的分隔符分割成不同的字符子串,第一個參數為NULL時,表示要查找下一個分割符。但是有一點需要注意,strtok會修改原來的字符數組。

      十二、內存操作函數

        內存操作函數對應于字符串操作函數,只是內存操作函數不對NUL字符進行識別。
        主要包括:memcpy、memmove、memcmp、memchr、memset

      十三、鏈表

        雙鏈表的優勢:
      (1)可以以任何方向或忽前忽后的遍歷鏈表
      (2)允許從任何一端開始遍歷

      十四、字符串數組的實現

        在c語言中,字符串數組的存儲實現只有兩種方式:
      (1)字符指針數組,即char buffer[10] = {"123","abc",...},該種方式一般只用于存儲已知的常量字符串,不用于程序運行時賦值的情況。
      (2)字符型二維數組,即char[][10],該方式可用于運行時字符串的賦值,注意:可以使用char (
      p)[10]指針按行訪問二維數組,效果就是用指針p來分別訪問每個字符串。

      十五、關于指針的高級聲明

      (1)int f; //一個整型變量
      (2)int *f; //一個指向整型變量的指針
      (3)int *f,g; //f是指針,g是普通變量
      (4)int f(); //函數聲明,返回值為int
      (5) int *f(); //函數聲明,返回值為int型指針
      (6)int (*f)(); //函數指針,指向函數調用起始點在內存中的位置
      (7) int* (*f)(); //函數指針,函數返回值為int*
      (8)int f[]; //數組聲明
      (9)int *f[]; //指針數組聲明
      (10)int f()[]; //非法聲明,因為函數只能返回標量,不能返回數組
      (11)int f[](); //非法聲明,函數數組非法,因為函數代碼長度不一,不能存于數組中
      (12)int (*f[])(); //函數指針數組
      (13)int *(*f[])(); //函數指針數組,函數返回值為int*類型
      (14)int (*f)(int, float); //ANSI C標準中的函數指針聲明,加入參數使聲明更加明確
      (15)int *(*g[])(int, float); //函數指針數組
      注意:函數指針在使用時,一定要先聲明函數原型,然后將函數指針初始化(使其指向一個具體函數),之后便可以向函數名一樣使用該函數指針。

      十六、怎樣理解解引用符號*

        解引用,其實就是解除引用,關于它的類型,可以根據聲明一步步上推。例如:
      對于char *a; 解引用 *a的類型就是char;
      對于char **b;解引用 *b的類型就是char *,也就是一個字符串,而 **b的類型則為char,是一個字符。

      十七、字符串常量的進階理解

        實質上,字符串常量出現在表達式中的時候,實際上是一個char型指針。比如:
      (1)"xyz" + 1 => y
      (2) "xyz"[2] => z
      (3) "0123456789ABCDEF"[value % 16] => 二進制轉換為字符,并以16進制打印

      十八、預處理指令

        理解一個概念:什么是宏?允許把參數替換到文本中,這種實現通常稱為宏或定義宏。
      (1)#define:兩種形式
      a. #define name stuff:stuff可以是任何文本,不局限于整型常量
      b. #define name(parameter-list) stuff: 宏
      (2)宏和函數的優劣比較
      a. 函數的調用和返回需要一定的開銷(函數調用棧),而宏只是替換,沒有函數棧的變化
      b. 宏的參數沒有類型,所以宏定義的表達式操作可以針對任何滿足該操作的類型,而函數必須指明參數類型,即宏是與類型無關的。如下例子:
      #define MAX(a,b) (a) > (b) ? (a) : (b) //可以用于任何滿足>符號比較的類型值
      c.宏參數可以傳遞類型,而函數不可以。
      #define MALLOC(n, type) \ ((type *)malloc((n) * sizeof(type)))
      該宏的調用:MALLOC(5, int);

      注意:宏后面不要有分號。
      由上可知,宏就是原原本本的文本替換,在替換時,一定要把所有的參數都帶入替換,避免出現帶副作用的宏參數,導致不易察覺的錯誤出現。

      (3)#undef:用于移除一個已經存在的宏定義
      (4)條件編譯指令
      `#if constant-expression
        statements

      elif constant-expression

        statements

      else

        statements

      endif`

      如果constant-expression為非零值,則statements語句被編譯,否則被忽略。
      (5)條件編譯的一大用處是解決多重包含的問題(一個文件被多次包含在一個源文件中),使用方法如下(在頭文件中使用):
      `#ifndef _HEADERNAME_H

      define _HEADERNAME_H 1

      /*all stuff */

      endif`

      (6)其他預編譯指令:#error、#line、#progma

      十九、c語言中的I/O

      (1)流的分類:
      a.文本流:用于處理文本,一般會對流數據進行格式化處理,以滿足文本的處理要求,如在行末添加換行符等。
      b.二進制流:不對流數據進行任何改變,保持其在程序或者是在設備/文本中的原本形式,適用于非文本處理。
      (2)I/O函數處理數據的三種基本形式:單個字符、文本行、二進制數據,對應的函數/函數族如下所示;
      a.單個字符:getchar/putchar
      b.文本行:gets/puts(未格式化輸入輸出)、scanf/printf(格式化輸入輸出)
      c.二進制數據:fread/fwrite

      posted @ 2019-02-18 21:11  Nolan24  Views(258)  Comments(0)    收藏  舉報
      主站蜘蛛池模板: 国产中文三级全黄| 读书| 超碰成人人人做人人爽| 成av人电影在线观看| 国产久免费热视频在线观看| 一边吃奶一边摸做爽视频| 亚洲日本精品国产第一区| 国产精品福利一区二区久久| 丁香五月激情图片| 欧美黑吊大战白妞| 国产熟女老阿姨毛片看爽爽| 浮妇高潮喷白浆视频| 国内不卡不区二区三区| 免费99视频| 中文字幕在线亚洲日韩6页| 余江县| 欧美日产国产精品| 成人爽A毛片在线视频淮北| 亚洲中文字幕在线二页| 亚洲av无在线播放中文| 西西人体大胆444WWW| 南昌县| 国产一区二区三区尤物视频| 日本久久99成人网站| 精品不卡一区二区三区| 日韩a∨精品日韩在线观看| 正在播放国产对白孕妇作爱| 欧美大bbbb流白水| 国产精品福利一区二区久久| 欧美丰满熟妇xxxx性大屁股| 国内精品人妻无码久久久影院导航 | 少妇人妻精品无码专区视频| 国产愉拍91九色国产愉拍| 国产精品久久毛片| 亚洲五月天一区二区三区| 99久久精品美女高潮喷水| 国内自拍偷拍一区二区三区| 成人无码午夜在线观看| 清苑县| 国产精品白浆免费视频| 成人免费无遮挡无码黄漫视频|