一、變數是什麼?
變數就是對一塊記憶體進行標記的識別符號:
(1)英文+數位+下劃線(個人傾向使用小寫加大寫開頭單詞組合 不使用下劃線);(2)不要和系統命名衝突
變數儲存在哪裏?
變數的標識其實就是存放在可執行檔案對應的段內:__text,__data,__bss
變數對應的內容存放在系統當中的記憶體區域中
(1)bss段的數據爲未初始化的全域性變數
(2)data段的數據爲程式中已初始化的全域性變數
(3)stack段的數據爲程式臨時建立的區域性變數
二、運算子
1.運算子是完成變數或表達式進行運算的符號
(1)運算子一般用於多個數值(變數、常數、表達式的值)
(2)表達式是以運算子+運算元+表達式
(3)語句就是以一段話說完,以;結尾的句子
2.左值與右值(關於這個值是否可以進行讀寫操作)
左值指能夠在=左邊存在的值,也就代表着這個值是可以進行賦值操作的
右值指能夠在=右邊的值,也就是這個值可以進行取值操作
3.常數
常數其實就是隻能夠進行取值操作的簡單量 一般常數都是隻能作爲右值的
諸如數位1 100 2000 1.33 2.55 字串 都是右值
三、程式結構
1.順序結構
通過運算子的結合性 程式碼從上往下執行來保證
2.分支結構
通過分支語句保證條件滿足和不滿足 來進行控制
包括 (1)if-else if-else if-else (2)switch case break
(參照C++相關經驗 不建議使用switch case break,也不要寫出巢狀複雜的多層if-else)
3.回圈結構
通過回圈語句保證條件滿足和不滿足回圈執行
包括 (1)while do-while (2)for foreach(3)goto
(參照C++相關經驗 不能使用goto;使用for(;;)代替while(true);使用for(;condition;)代替while(condition))
continue代表的是跳出本次回圈,continue以後的語句本次回圈不再執行
break跳出最近的回圈體 之後的所有回圈都不再執行
三大結構都是可以進行巢狀使用的 另外需要注意回圈的死回圈處理
四、函數
1.函數是C語言實現模組化程式設計的基礎 其具備3個關鍵:宣告、實現、呼叫
(1)對於一個函數最基本的特徵進行說明 一般寫在檔案最前面或標頭檔案當中
(2)實現 需要完整帶有函數主體的內容
{}一般稱爲域,如果是和特定的運算系結在一起則被稱爲XX體,如函數體、回圈體、分支體
(3)函數的呼叫,函數呼叫就是函數使用的方式
2.函數的特徵
函數的返回值型別可以是任何型別 在函數體當中使用return關鍵字返回函數
return代表函數體的結束,返回匹配函數返回值的值
函數的參數和變數的定義是差不多的
由於函數本質是值傳遞的過程,有形參和實參的區別:實參指從外部傳入值到函數內部的參數,一般是函數呼叫的時候,填寫到參數列表的參數,形參值在內部接收傳入的值。
在c語言中實參和形參之間的數據傳輸是單向的「值傳遞」方式,也就是實參可以影響形參,而形參不能影響實參。指針變數作爲參數也不例外,但是可以改變實參指針變數所指向的變數的值。就是無論是實值還是指針傳入函數的都是副本。當函數返回指針時,其實返回的是函數內變數指針的副本,由於在主函數結束前,爲該函數分配的記憶體一直存在,則該指針地址會一直存在。如果多次使用不同參數呼叫該函數,則多個返回的指針值是一致變化的。因此應該在函數外對該返回指針所指向的值進行復制,以實現正確使用。
例如:
#include <stdio.h>
void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
int main(void)
{
int a=1,b=2;
int *pa=&a,*pb=&b;
swap1(a,b);
printf("s1:a=%d,b=%d\n",a,b);
a=1,b=2;
swap2(pa,pb);
printf("s2:a=%d,b=%d\n",a,b);
a=1,b=2;
swap3(pa,pb);
printf("s3:a=%d,b=%d\n",a,b);
return 0;
}
void swap1(int x,int y){
int t;
t=x;
x=y;
y=t;
}
void swap2(int *px,int *py){
int t;
t=*px;
*px=*py;
*py=t;
}
void swap3(int *px,int *py){
int *pt;
pt=px;
px=py;
py=pt;
}
3.函數宣告
函數宣告的方式無需函數體 只需要返回值 函數名 函數參數列表
這種宣告的格式也被稱爲函數原型 在介面說明檔案當中只需要給到函數的原型宣告即可 例如man
五、變數
1.變數的儲存位置
(1)變數的作用域 其和編譯階段有關,如果超出作用域就會導致編譯錯誤
基於全檔案的作用域,這種全域性變數需要用到多檔案編譯
基於本檔案的作用域,這種一般稱爲靜態全域性變數,只和這個檔案相關 其他檔案無法使用
函數內的區域性變數 只能夠在本函數當中使用,其他函數當中無法使用
基於域的區域性變數,只能夠在域當中使用,域外部無法使用
變數的作用域範圍爲:變數的定義或者擴充套件定義開始,直到域結束爲止
擴充套件作用域一般使用extern關鍵字在需要的位置進行擴充套件
如果使用extern對於區域性變數進行擴充套件作用域,會導致鏈接的過程當中找不到該變數,出現鏈接錯誤
產生該問題的原因未extern只會擴充作用域,但是區域性變數在對應的區域性域當中沒有真正定義
(2)變數的生命週期 其和執行階段有關,如果超出生命週期,就會導致執行錯誤
變數的儲存位置
對於非靜態區域性變數,一般我們稱其定義的位置在棧區,棧區的特點當對應的域結束時,系統會對這塊空間進行釋放。另外可以手動申請存放到堆區,堆區需要手動進行釋放。
對於全域性變數,其自帶靜態特性,可以通過static關鍵字宣告變數存放在靜態區。靜態區的特點是和整個程式相關的,程式結束,其纔會釋放。
生命週期的開始爲變數的定義時,結束爲變數的空間釋放時。
static針對於宣告週期,使其宣告的變數存放到靜態區,可以理解爲給變數續命。而針對於作用域,其表示限定作用域,比如在某些.c檔案當中定義的函數,新增static限定該函數只能適用於當前的.c檔案。
六、主要用到的庫
(1)輸入輸出相關
<stdio.h>
(2)字串或字元空間處理相關的函數
<string.h>
(3)標準庫 存放和系統相關的函數
<stdlib.h>
(4)時間相關的函數
<time.h>
(5)和系統相關及操作系統內核相關的函數
<unistd.h>
(6)數學運算相關
<math.h>
七、雜項
(1)abort強制退出程式 exit退出當前進程 如果當前只有一個主進程則相當於是return結束整個程式
(2)rand是生成亂數 srand是設定隨機種子
如果設定的隨機種子相同 則生成的亂數序列也相同 可用於模擬驗證結果
當想要生成隨機變化的亂數時 可使用:
srand(time(NULL));
printf("%d\n", rand()% 10000);
atoi爲字串轉數位
system爲系統功能呼叫 例如:system(「echo 你好世界」);
各種型別錯誤
(1)編譯期錯誤一般爲C語言語法性的錯誤;
(2)鏈接期錯誤一般爲找不到實際呼叫的錯誤;
(3)執行期錯誤有兩種:①會導致程式崩潰的錯誤,一般是由於不符合系統處理的錯誤導致程式崩潰的錯誤,②數據型別出錯。