C和指標關鍵點總結

2021-10-14 04:39:05 字數 3804 閱讀 7865

指標常量與常量指標

int *p;指向普通整形指標

intconst *p 指向整形常量的指標,指標指向可以改變,但指標指向的值不能改變。

int*const p指向整形的常指標,指標指向不能改變,但指標指向的值可以改變。

intconst *const p指向整形常量的常指標,指標指向和指標指向的值均不可改變。

extern與static區別

作用範圍:extern作用於多個檔案,類似於標頭檔案,static變數則只在本檔案中有效(.c檔案)。

宣告方式:宣告為extern的變數,程式會從別的.c檔案中尋找或本檔案的mian函式之外的地方找。若在多個檔案中宣告,則會出錯。

static在本檔案中宣告,.c檔案中有效,初始化一次.

break/continue/goto loop

break:可以使程式執行時中途跳出迴圈體,即:強制結束迴圈,接著執行迴圈體下面的語句。

但break僅對迴圈結構起作用,如for ,while,switch等,對if語句不起作用,且break一次只能跳出一層迴圈結構。

continue:結束本次迴圈,即跳出迴圈體中下面尚未執行的語句,接著進行下一次是否執行迴圈的判定。

goto loop 用於跳躍,一般可用於多層迴圈結構,從內層的迴圈結構跳到外面乙個位置,並繼續執行loop後面的語句。

區別:continue只是結束本次迴圈,而不終止整個迴圈的執行,break則強制終止整個迴圈過程。

位移操作符

左移n位,左側丟棄n位,右側新增n位0

右移n位,兩種方案:方案一邏輯移位左側補上n位0,方案二算術移位,左移補上n位(0還是1取決於符號位) 如:c,d,同樣右移1位,c增加,d減少

復合運算子

逗號表示式

指標與位址

&獲取變數所對應的位址,*訪問指標變數所表示的位址。

**d=&b; a<-b<-d

可變引數列表

stdarg巨集

可變引數的限制

指標和下標

應用:陣列賦值或者初始化等涉及到陣列下標問題時均可以換成指標,來提高執行效率。

結構體自引用

結構體不完整宣告

結構體訪問時,->和.號的用法,->是間接訪問符號,指標指向結構體,訪問結構體成員變數,而.號則為結構體訪問,並沒有指標參與進來。

函式(結構體)執行效率遠小於函式(結構體指標),原因:前一種按照c語言引數傳遞方式要將引數的乙份拷貝傳遞給函式,而後一種則不需要,但可能存在成員變數被修改的危險,所以可以加上const,為進一步提高效率,也可宣告為暫存器指標register.

位段好處:

1.能夠把長度為奇數的資料報裝在一起,節省儲存空間,當程式需要使用上千種結構時,使用此法很重要。

2.很方便的訪問整形值得部分內容,如磁碟控制器。

malloc分配連續記憶體,若記憶體申請成功,返回指向該記憶體的起始位置的指標,否則返回null,因此任意malloc函式,都要對其返回值進行檢查確保記憶體申請成功。

malloc巨集接受元素的數目能及每種元素的型別,計算總共需要的記憶體位元組數,並呼叫alloc獲得記憶體。alloc呼叫malloc並進行檢查,確保返回的指標不是null。

第乙個非比尋常的#define指令,防止因其他**塊直接塞入程式而豆兒直接呼叫的malloc行為,增加該條指令後,若程式偶爾呼叫了malloc,程式將因語法錯誤而無法編譯。在alloc中必須加入#undef指令,才能呼叫malloc而不出錯。

警告:1.不要訪問已經被釋放的記憶體,假如你對乙個指向動態記憶體的指標複製了幾份分布於程式各處,你無法保證使用其中乙個指標時其記憶體沒有被其他指標釋放。

2.必須保證記憶體釋放之前,所有指向該記憶體的指標停止使用。

3.記憶體不用後,一定要釋放,防止記憶體洩漏!

#define name stuff

#define巨集

警告:1.盡量不要使用define巨集定義函式,如下#define square(x) x*x

但a=5;return square(a+1);結果為11; a+1*a+1

巨集和函式

1.巨集定義比函式效率和規模上更勝一籌。

2.函式必須指定引數型別,如下,函式很難實現。

3.注意巨集引數的***,如:

替換成:

較大的值自加兩次,較小的值自加一次。

其他指令

錯誤報告

errno

流i/o總覽

fopen函式

r:唯讀,w:只寫,+:增加一功能,如r+可讀寫,w+可讀寫,b:二進位制方式

a:附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的eof符不保留)

fseek函式

fseek(fp,long offset,intfromwhere),

檔案頭0(seek_set),當前位置1(seek_cur),檔案尾2(seek_end))為基準,偏移offset(指標偏移量)個位元組的位置。如果執行失敗(比如offset超過檔案自身大小),則不改變stream指向的位置.

file *input;

input = fopen("data.txt", "r");

if (input == null)

}若沒有data.txt,則返回:no such file or directory.

字元i/o

注意事項:

1、getc的引數不應當是具有***的表示式。有***的表示式,指的是表示式執行後,會改變表示式中某些變數的值。比如++i * ++i。

2、因為fgetc,fputc函式,所以可以得到其位址。所以允許將fgetc的位址作為乙個引數傳送給另乙個函式。

3、呼叫fgetc所需時間很可能長於呼叫getc,因為呼叫函式通常所需的時間長於呼叫巨集。

撤銷字元i/o

未格式化的行i/o

fputs()函式:傳遞給其的buff必須包含字串,預期以nul位元組結尾,字串逐字寫入,若沒有換行符,則不會寫入換行符,若包含幾個,則所有換行符都能寫入,因此fgets()只能讀一行,fputs()一次寫入行的一部分,整行或多行。

gets()和puts()沒有緩衝區長度引數,長輸入行讀到短的緩衝區,多出來的字元將被寫入到緩衝區後面的位置,破壞其他不相關的量。區別,puts()寫入字串時,自動在其末尾加入換行符。

格式化的行i/o

注意:1.函式的引數型別與對應的格式**不匹配。

2.限定符指定引數的長度,避免引數比預設的引數更長或更短(如引數的位數超過short的最大長度)。

3.sprintf()函式將結果作為以nul結尾的字串儲存到指定的buff中而不是流中,記憶體容易超限溢位。

二進位制i/o

size:緩衝區元素的位元組數,count:讀取或寫入放入位元組數

注意:1.二進位制形式讀取/寫入檔案效率最高。但同時只能讀取一種資料型別的資料(只能輸入一種位元組數)。

2.若輸入過程遇到檔案尾或者輸出過程出現錯誤,則函式返回值要比輸入的count小。

3.其作用類似於sscanf和sprintf()。

ftell函式的返回值可以作為fseek函式的offset量,from:計算offset的起始位置位於seek_set(流的起始位置),seek_cur(流的當前位置),seek_end(流的尾部位置)。

fgetpos()獲取儲存檔案的當前位置,fsetpos()設定當前位置為儲存在*position指向的值,至於fpos_t表示檔案位置的方式,不唯一,最安全的方法就是直接將fgetpos()的postion傳給fsetpos().

setbuf設定buf對流進行緩衝,大小為bufsiz(stdio.h中定義),若buf為bull,則關閉流的所有緩衝方式。

setvbuf允許自定義緩衝型別及緩衝大小。

警告:謹慎勿用。

c語言指標總結

第八章 指標 知識結構 1 指標的基本概念 2 怎麼定義指標 3 指標的運算 1 指標的基本概念 記憶體 以位元組為單位,由若干個位元組組成 為了便宜管理,給每個位元組編號 十六進製制 每乙個位元組的編號在整個記憶體都是唯一 定義變數 在計算機記憶體中去預定記憶體 各類變數所預定的空間大小不同 整型...

C語言關鍵字總結

變數可以分為 全域性變數 靜態全域性變數 區域性變數和靜態區域性變數 按儲存區域分,全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。按作用域分,全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式...

C語言關鍵字總結

用來宣告長型的型別 7 short 宣告短整型變數或函式例 short int a 用於宣告乙個短整型變數 8 signed 宣告有符號型別變數或函式 將變數宣告為有符號型.預設變數就為signed 型。一般可省略。9 struct 宣告結構體變數或函式例 struct somekkk 用來宣告結構...