程序結構
- 預處理指令cpp
- 函數
- 變量
- 語句&表達式
- 註釋
基本語法
- token, C 程序由各種令牌組成,令牌可以是關鍵字、標識符、常量、字符串值,或者是一個符號。
- 註釋 /* 我的第一個 C 程序 */
數據類型
算術類型
整數型
char(1 Byte) , unsigned char int(4), unsigned int short(2), unsigned short long(4), unsigned long
浮點型
float(4), double(8), long double(16)
- void
- 派生類型
- 指針
- 數組
- 結構體
- 共用體
- 函數
變量
沒什麼好說的
常量
- #define 預處理器。
- 使用 const 關鍵字。
存儲類
- auto 所有局部變量默認的存儲類
{
int mount;
auto int month;
}
- register 存儲類用於定義存儲在寄存器中,變量的最大尺寸等於寄存器的大小
{
register int miles;
}
static 存儲類指示編譯器在程序的生命週期內保持局部變量的存在,也可以應用於全局變量。當 static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內
extern 存儲類用於提供一個全局變量的引用,全局變量對所有的程序文件都是可見的; extern 是用來在另一個文件中聲明一個全局變量或函數
運算符
判斷
循環
函數
數組
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
指針
一個變量,其值爲另一個變量的地址,即,內存位置的直接地址
字符串
strcpy(s1, s2);
strcat(s1, s2);
strlen(s1);
strcmp(s1, s2); 比較
strchr(s1, ch); ch 出現的index
strstr(s1, s2); s2 第一次出現的位置。
結構體
存儲不同類型的數據項,成員訪問運算符(.)
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
指向結構體的指針
結構變量的地址
struct_pointer = &Book1;
訪問結構體的成員 ,必須使用 -> 運算符
void printBook( struct Books *book ) { printf( "Book title : %s\n", book->title); printf( "Book author : %s\n", book->author); printf( "Book subject : %s\n", book->subject); printf( "Book book_id : %d\n", book->book_id); }
位域
把一個字節中的二進位劃分爲幾個不同的區域,並說明每個區域的位數
struct bs{ int a:8; int b:2; int c:6; }data;
共用體
- 允許您在相同的內存位置存儲不同的數據類型,
- 共用體佔用的內存應足夠存儲共用體中最大的成員
爲了所有的成員都能完好輸出,因爲同一時間只用到一個成員
union Data { int i; float f; char str[20]; } data;
typedef
爲類型取一個新的名字
typedef unsigned char BYTE;
標識符 BYTE 可作爲類型 unsigned char 的縮寫
輸入輸出
int scanf(const char *format, …) 函數
用於從標準輸入(鍵盤)讀取並格式化
int printf(const char *format, …) 函數
發送格式化輸出到標準輸出(屏幕)。
int getchar(void) 函數
從屏幕讀取下一個可用的字符,並把它返回爲一個整數
int putchar(int c) 函數
把字符輸出到屏幕上,並返回相同的字符
char *gets(char *s) 函數
從 stdin 讀取一行到 s 所指向的緩衝區,直到一個終止符或 EOF
int puts(const char *s) 函數
把字符串 s 和一個尾隨的換行符寫入到 stdout。
文件讀寫
打開文件
fp = fopen("/tmp/test.txt", "w+");
關閉文件
fclose(fp);
寫入文件
fputs("This is testing for fputs...\n", fp); fprintf(fp, "This is testing for fprintf...\n"); 也可以使用 int fprintf(FILE *fp,const char *format, ...) 函數來寫把一個字符串寫入到文件中
讀取文件
fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff );
二進制
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
預處理器
#define 定義宏
#include 包含一個源代碼文件
#undef 取消已定義的宏
#ifdef 如果宏已經定義,則返回真
#ifndef 如果宏沒有定義,則返回真
#if 如果給定條件爲真,則編譯下面代碼
#else #if 的替代方案
#elif 如果前面的 #if 給定條件不爲真,當前條件爲真,則編譯下面代碼
#endif 結束一個 #if……#else 條件編譯塊
#error 當遇到標準錯誤時,輸出錯誤消息
#pragma 使用標準化方法,向編譯器發佈特殊的命令到編譯器中
錯誤處理
errno、perror() 和 strerror()
可變參數
http://www.runoob.com/cprogramming/c-variable-arguments.html
內存管理
void *calloc(int num, int size);
該函數分配一個帶有 num 個元素的數組,每個元素的大小爲 size 字節。
void free(void *address);
該函數釋放 address 所指向的h內存塊。
void *malloc(int num);
該函數分配一個 num 字節的數組,並把它們進行初始化。
void *realloc(void *address, int newsize);
該函數重新分配內存,把內存擴展到 newsize。
主要參考菜鳥教程:
http://www.runoob.com/cprogramming/c-data-types.html