C 語言是一種面向過程的高級語言。 運行速度與匯編語言編寫的代碼運行速度幾乎一樣。C 語言的源碼文件擴展名為 .c 例如 hello.c 。
概述
C 語言有三套標準分別是 C89 C99 C11,目前最常用的是 C99 標準。
C 編譯器,寫在源文件中的源代碼需要編譯,轉化為機器語言,這樣 CPU 可以按給定指定執行程序。最常用的免費可用的編譯器是 GUN 的 gcc 編譯器,適合于 C 和 C++ 編程語言。
在 Linux 上安裝 gcc 可以采用如下命令:
yum -y install gcc yum -y install gcc-c++
也可以手動編譯,可以參考 gcc 官網。
安裝完成后執行 gcc -v 可以查看編輯器版本信息。
先寫一個 hello.c 文件,代碼如下
#include <stdio.h>int main() {printf("Hello, World! \n");return 0; }
?安裝好 gcc 編譯器后,在 hello.c 文件所在的目錄下打開命令行,執行 gcc hello.c -o hello 然后會生成一個 hello.exe 文件(在 windows 環境下,如果不加 -o hello,那么默認會生成一個 a.exe),然后執行 hello.exe,即可看到屏幕顯示 Hello World。
數據類型
C 語言中數據類型指的是用于聲明不同類型的變量或函數的一個廣泛的系統。變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式。C 中數據類型分為:
- 基本類型
- 整數類型 char int
- 浮點類型 float double
- 派生類型
- 指針類型 Pointer
- 數組類型 Array
- 結構類型 Struct
- 共用體類型 Union
- 函數類型 Function
- 枚舉類型
- void 類型
以上為 C 中數據類型。
變量和常量
變量的定義就是告訴編譯器在何處創建變量的存儲,以及如何創建變量的存儲。
變量聲明向編譯器保證變量以指定的類型和名稱存在,這樣編譯器在不需要知道變量完整細節的情況下也能繼續進一步的編譯。變量聲明只在編譯時有它的意義,在程序連接時編輯器需要實際的變量聲明。
變量的聲明有兩種情況:
- 一種需要建立存儲空間的。例如 int a 在聲明的時候就已經建立了存儲空間。
- 另一種需要建立存儲空間,通過使用 extern 關鍵字聲明變量名而不定義它。例如:extern int a 其中變量 a 可以在別的文件中定義。
- 除非有 extern 關鍵字,否則都是變量的定義。
常量是固定值,在程序執行期間不會改變。又稱字面量。常量分為整數常量、浮點常量、字符常量、字符串常量。
定義常量兩種方式:
- 使用 #define 預處理器
- 使用 const 關鍵字
運算符和函數
運算符分為算術、關系、邏輯、位、賦值運算符等。
判斷結構和循環結構和 Java 類似。
函數也和 Java 類似,只是在 Java 中稱為方法。但是在函數參數上面稍有區別。
C 語言中調用函數時,有兩種向函數傳遞參數的方法:
- 傳值調用 把參數的實際值復制給函數的形式參數,修改函數內的形式參數不會影響實際參數。
- 引用調用 通過指針傳遞方法,形參為指向實參地址的指針,當對形參的指向操作時,就相當于對實參本身進行的操作。
指針
個人認為,C 和 Java 最大的區別之一就是 C 有指針的概念。
每一個變量都有一個內存位置,每一個內存位置都定義了可使用 & 運算符訪問的地址,它表示了在內存中的一個地址。
#include <stdio.h>int main() {int var = 20; /* 實際變量的聲明 */int *ip; /* 指針變量的聲明 */ip = &var; /* 在指針變量中存儲 var 的地址 */printf("Address of var variable: %p\n", &var);/* 在指針變量中存儲的地址 */printf("Address stored in ip variable: %p\n", ip);/* 使用指針訪問值 */printf("Value of *ip variable: %d\n", *ip);return 0; }
函數指針是指向函數的指針變量。 函數指針變量的聲明 typedef int (*fun_ptr)(int, int) 。
#include <stdio.h>int max(int x, int y) {return x > y ? x : y; }int main(void) {/* p 是函數指針 */int (*p)(int, int) = &max; // &可以省略int a, b, c, d;printf("請輸入三個數字:");scanf("%d %d %d", &a, &b, &c);/* 與直接調用函數等價,d = max(max(a, b), c) */d = p(p(a, b), c);printf("最大的數字是: %d\n", d);return 0; }
C 語言也可以接受函數作為參數。?
預處理器 與頭文件
預處理器不是編譯器的組成部分,但是它是編譯過程中一個單獨的步驟。簡言之,C 預處理器只不過是一個文本替換工具而已。它們會指示編譯器在實際編譯之前完成所需的預處理。可以把 C 預處理器(C Preprocessor)簡寫為 CPP。
頭文件是拓展名為 .h 的文件名,包含了 C 函數聲明和宏定義,被多個源文件中引用共享。有兩種類型的頭文件:自己編寫的頭文件和編譯器自帶的頭文件。
引用頭文件的語法:
- #include <file> 引用系統頭文件
- #include "file"? 引用用戶頭文件
編寫預處理器放在頭文件中,可被多個文件引用。
錯誤處理
C 語言不提供對錯誤處理的直接支持,但是作為一種系統編程語言,它以返回值的形式允許您訪問底層數據。在發生錯誤時,大多數的 C 或 UNIX 函數調用返回 1 或 NULL,同時會設置一個錯誤代碼 errno,該錯誤代碼是全局變量,表示函數調用期間發生了錯誤。可以在 errno.h 頭文件中找到各種各樣的錯誤代碼。
?
INSERT