標籤:char* 通過 記憶體錯誤 現在 方式 ++操作 bsp type 精度
一. 快速上手
1. 邏輯上刪除一段程式:
#if 0
statements
#endif
2. printf函數:%d十進位整型值、%o八進位、%x十六進位、%g浮點值、%c字元、%s字串
scanf函數:%d整型值、%ld長整型、%f浮點數、%lf雙精確度、%c字元、%s字串
3. char *strchr(char* dest, char src) => 返回src字元在dest字串中第一次出現的位置
char *strstr(char* dest, char* src) => 返回src字串在dest字串中第一次出現的位置
二. 基本概念
1. cc -c test.c main.c將源檔案test.c、main.c編譯產生目標檔案test.o和main.o; cc test.o main.o連結幾個目標檔案
2. int ch; while((ch = getchar()) != EOF){ putchar(ch) };
三. 資料
1. 可以把字串常量賦值給一個“指向字元的指標”,但是不能把字串常量賦值給一個字元數組,因為字串常量的直接值是一個指標,而不是這些字元本身。
2. char *message = "Hello World";(把message聲明為一個指向字元的指標,並用字串常量中的第一個字元的地址作為其值初始化)相當於char *message; message = "Hello World";
3. typedef出現在定義前面 char *ptr_to_char; typedef char *ptr_to_char; ptr_to_char a;將a聲明為指向字元的指標
四. 語句
1. while( scanf("%f", &value) == 1 && value >= 0){}
2. switch(expression) {case constant-expression:} //expression的結果必須是整型值,constant-expression必須是常量運算式
3. switch(ch)
{
case ‘\n‘: line += 1;
/* FALL THRU */fall through表明ch貫穿所有case,當滿足\n時除了執行line+=1,下面的words+=1和chars+=1都會執行
case ‘ ‘:
case ‘\b‘: words += 1;
/* FALL THRU */
default: chars +=1;
}
4. c不具備布爾類型,用整型運算式代替
5. c不具備任何I/O輸入/輸出語句,c也不具備任何異常處理語句,這些都是通過調用庫函數實現的。
五. 操作符和運算式
1. 將指定位元置1:value |= (1 << bit_number);將指定位元置0:value &= (~(1 << bit_number));判斷指定位元是否為0:value &= (1 << bit_value)
2. 逗號運算式的值為整個運算式最右邊的值。if(b-10, c+4, d>0)//從左往右依次執行,但整個運算式的值為d>0
3. 下標引用:array[ 下標 ] 等價於 *(array + (下標))
4. lexp代表左值,左值代表一個位置,rexp代表右值,右值代表一個值,在左值的地方不能使用右值,在右值的地方可以使用左值
5. 大寫轉小寫:#include <ctype.h> tolower(ch);
六. 指標
1. 硬體通過地址訪問記憶體位置,編譯器幫我們實現通過變數訪問記憶體位置
2. 值的類型並非值本身所固有的特性,而取決於它的使用方式
3. 變數的值就是分配給該變數的記憶體位置所儲存的值,即使是指標變數也不例外
4. 段違例:segmentation violation;記憶體錯誤:memory fault
5. 在特定數組中尋找某個特定值得函數:返回狀態值表示是否找到,如果找到,再返回指向該值得指標
6. 在對指標進行解引用操作/間接訪問之前,必須確保指標不是NULL指標
7. *(int *)100 = 25;將整型強制轉換為指向整型的指標,用於訪問裝置控制器介面
8. *p+1表示*p的值加1;*(p+1)表示p指向的地址加1後取值
9. char ch;char *cp = &ch; *cp++//①++操作符產生cp的拷貝②++操作符再增加cp的值③最後在cp的拷貝上執行間接訪問操作。
當運算式*cp++作為左值時表示ch的記憶體位置,作為右值時表示ch的值
2. 431 109
C和指標