《C程序設計語言》總結二

指針和數組

  • 指針經常和goto語句一起使用創造出一些難以理解的代碼
  • 取地址運算&只能作用於在內存中的變量或者數組元素,對於表達式、常量或者寄存器變量不適用
  • 指針的定義int *ip;意思是 *ip是int型
  • 每個指針變量都指向一個具體的數據類型,但是指向空的指針除外,void *用來存儲其他類型的指針,但是void類型的指針不能用間接引用取其值
  • 任何能用數組下表完成的操作都可以用指針完成,而且指針完成的速度更快一些
  • 指針+1指向下一個元素,對應於char類型就是下一個字節,對應於int就是後四個字節
  • 數組名就是第一個元素的地址,就是指針
  • 在計算a[i]的時候,C會把它轉化爲 *(a + i),這兩種表達方式相同
  • 數組名和指針的一個不同就是:指針是變量,可以進行+或-操作,數組名不是變量
  • 傳送的實參是數組名的時候,真正傳送的是第一個元素的地址
  • 對於指針的操作,越界比較或者指針的算術運算不會出問題,但是如果要越界賦值就會報錯,因爲你對越界所訪問的內存沒有修改權限,你可以讀出它的值但是你不能修改它
  • C語言中,0永遠不是一個有效的地址,所以返回0可以指示出錯
  • 指針和整型之間不能替換,但是0是僅有的例外。0可以賦值給指針,指針也可以和0比較,符號常量NULL常用來代替0,因爲這樣表意更明顯
  • 如果p和q指向同一個數組的元素,那指針之間可以比較(==、!=、<、>等)
  • 在指針的算術運算中,指向不同數組元素之間的運算沒有定義,但是一個例外是可以使用數組最後一個元素的下一個元素的地址

  • 指針的四種合法運算:①同類型指針的賦值②指針加減整數③指向同一數組的指針的比較和相減④與整數0的比較或者賦值0給指針

  • 字符串常量“I am a string”是字符數組
  • 像上述字符串傳入到printf函數中的時候,printf函數得到的是指向字符串數組第一個元素的指針
  • 定義一個字符指針並把一個字符串賦值爲它,是讓指針指向存儲這個字符串的數組,但是字符串常量存儲在常量存儲區,所以不能通過指針修改這個字符串常量
  • t++中++和 的優先級一樣高,並且是右結合,所以這個表達式的意思是取出當前指針所以的內容,並讓指針指向下一個元素
  • 指針是一個變量,那麼指針當然可以保存在數組中,保存指針的數組被稱爲指針數組,指針數組名仍然是第一個元素的地址
  • 數組只有在定義的時候才能進行整體賦值
  • 如果傳遞的參數是一個二維數組,那麼這個數組的列必須指明,行數可以不指明
  • 二維指針和指針數組:二維數組真真正正的擁有那麼多可以操作的存儲空間,而指針數組,在指針未被賦值之前只有存儲指針的空間。指針數組的好處是列可以不同長

  • main函數被調用時,有兩個參數 argc(argument count)和argv(argument vector)。argv是一個指向字符串數組的指針。argv[0]是程序的名字,所以argc至少是1

結構體

  • 結構體可以被複制,賦值,傳給函數,被函數返回。對於結構體合法的操作僅有:作爲整體賦值和複製、用&取它的地址以及訪問其成員
  • 傳指向結構體的指針比傳結構體方便多了
  • sizeof不能在#if中用,因爲預處理器不分析類型名,但是#define中的表達式不是由預處理器求值,所以在這裏合法
  • 結構體中包含指向自身的指針是合法的,但是包含自身就是非法的了
  • 在typedef聲明的類型出現的位置是在變量名的位置出現,而不是在緊跟在typedef之後,例如typedef int ( PEI) (char , char *);意思是定義PEI爲一直指向參數爲兩個指針的函數的指針,就是PEI是一個指向函數的指針,它出現的位置是正常情況下我們定義變量名的位置而不是緊跟在typedef之後
  • 使用typedef的目的:①定義那些機器相關的類型②便於程序文稿或者理解
  • 共用體只能對其中第一個元素初始化,就是定義共用體是排在第一的元素

輸入和輸出

  • 符號常量EOF定義爲-1,使用EOF便於移植
  • 在許多環境中,可以通過<輸入重定向符將程序輸入從鍵盤更改爲某個文件,同理對於>輸出重定向
  • 像getchar和putchar以及tolower這樣的“函數”常常是宏,這樣就避免了函數調用的開銷
  • 在printf中出現在%號後面的東西可以包括:①符號-,代表左對齊②表示至少輸出多少位的數,如果需要的話會在左邊填充空格(或者在左對齊的情況下在右邊填充空格)③小數點④小數點後的數,精度,表示從一個字符串中打印最多多少個字符;或者小數點後多少位小數
  • printf用第一個參數確定後面有多少個參數以及他們的類型,不匹配會出錯
  • sprintf同printf一樣,只是把結果保存到第一個指針參數中
  • scanf返回的是成功匹配賦值變量的個數
  • 當需要讀取格式不確定的輸入時,最好先一次讀一行,然後用sscanf處理
  • 文件讀取時,在讀和寫之前應該先用庫中的函數open打開才行
  • 文件的打開模式有三種,“r”讀,“w”寫,“a”追加;一些系統區分文本和二進制,對於區分二進制的,“b”必須加到打開模式串後面
  • 如果要寫或者追加的文件不存在,就創建一個;如果以寫的方式打開一個文件,那麼這個文件中的內容都消失;嘗試讀一個不存在的文件是錯誤的;如果有錯誤,文件指針返回NULL
  • C程序開始執行時,操作系統有責任打開三個文件提供文件指針:標準輸入,標準輸出以及標準錯誤處理;相應的指針是stdin、stdout以及stderr
  • stdin和stdout是常量而不是變量
  • 行輸入和輸出:char *fgets(char *line, int maxline, FILE *fp)取下一行輸入到字符數組line中,最多maxline-1個字符;通常fgets返回line,文件結束或者錯誤返回NULL
  • int fputs(char *line, FILE *fp)寫一行,但是不包含換行符
  • 類似的,gets和puts有相同的效果,但是它們僅作用於標準輸入輸出,並且gets不包含結尾的\n,但是puts卻把它加上去了
  • void *malloc(size_t n) void *calloc(size_t n, size_t size)必須強制類型轉換返回值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章