思維導圖
介紹
前接上文C 雜談之 指標與陣列 (一),接續往下談指標和陣列。
指標與陣列 ——承接上文進行擴充套件
你知道X = Y,在編譯執行過程中,是什麼樣嗎?
字元指標與函式
1> 字串是一個以”結尾的字元陣列。
看一個例子:printf接受的是一個指向字元陣列第一個字元的指標。
這個例子與下面兩個程式碼是一個道理.
2> 幾個常用字元函式的編寫。
1>>> strcat(s,t)函式,把t指向的字元複製到s指向的字元後面?——注意”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <stdio.h> #include <assert.h> /* strcat(ps, t): Copy the charactor pointed * by t append to the character pointed by s */ void *strcat(char *ps, char *t){ char *addr = ps; assert((ps != NULL) && (t != NULL)); while(*ps){ /* The s point to the last character */ ps++; } while(*ps++ = *t++){ /* Copy t append to the s*/ } return addr; } int main(){ char s[5] = "AB"; char *t = "E"; printf("%s\n", strcat(s, t)); return 0; } |
注意:在strcat裡的兩個指標ps和t,方法結束後,這兩個函式都指向”後面,因為ps++操作是”先取結果,後自增”
記憶體變化:
2>>> 函式strend(s,t):字串t出現在字串s的尾部,返回1,否則返回0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
strend int strlen(char *p){ int iLen = 0; while(*p){ iLen++; p++; } return iLen; } /* strend:find t in s */ int strend(char *s, char *t){ int sLen = strlen(s); int tLen = strlen(t); if(tLen > sLen) return 0; while(*s) s++; while(*t) t++; for(;tLen--;){ if(*--t != *--s) return 0; } return 1; } int main(){ char *s = "Hell Wold , Chuanshanjia"; char *t = "Chuanshanjia"; printf("%d\n", strend(s, t)); return 0; } |
3>>> strncpy(s,t,n) 將t中前n個字元複製到s中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
strncpy(s,t,n) #include <stdio.h> int strlen(char *p){ int i = 0; while(*p){ p++; i++; } return i; } /* t中最多前n個字元複製到s中 */ char *strncpy(char *s, char *t, int n){ char *addr = s; if(!strlen(s) || !n) return 0; int tLen = strlen(t); if(!tLen) return 0; if(tLen < n) n = tLen; // Move the pointer s to the last while(*++s) ; while(n--){ *s++ = *t++; } return addr; } int main(){ char s[20] = "Hell World "; char *t = "Chuanshanjia"; printf("%s\n", strncpy(s, t, 2222)); return 0; } |
命令列引數
1.第一個引數(常用argc表示)(:執行時命令列引數數目;第二個引數(常用argv表示)是一個指向字串陣列的指標。
2.C語言規定,argv[0],表示啟動程式的名稱。
3.例項
執行結果:
記憶體分配:
解釋:
>> argv是一個指向指標陣列的指標。
所以接受引數也可以寫成:
結合上圖,我們可以這樣理解:從裡向外看
複雜宣告
1.閱讀——從右向左規則。
>> 規則符號:
———————————————————–
* 讀作”指向…的指標”
[] 讀作”…的陣列”
() 讀作”返回…的函式”
———————————————————–
下面兩個示例:
int *f() ; // f: 返回指向int型的指標
>>步驟:
1)找識別符號f:讀作”f是…”
2)向右看,發現”()”讀作”f是返回…的函式”
3)向右看沒有什麼,向左看,發現*,讀作”f是返回指向…的指標的函式”
4)繼續向左看,發現int,讀作”f是返回指向int型的指標的函式”
int (*pf)(); // pf是一個指標——指向返回值為int型的函式
1)識別符號pf,讀作“pf是…”
2)向右看,發現),向左看,發現*,讀作 “pf是指向…的指標”
3)向右看,發現”()”,讀作“pf是指向返回…的函式的指標”
4)向右看,沒有,向左看發現int,讀作”pf是指向返回int型的函式的指標”
總結
我最近著重看C,是因為我想深入瞭解一下PHP核心語言和伺服器模組開發。現在的C語言,能夠讓我更深入的瞭解計算機內部。