字串是以ascii字元nul結尾的字串行。ascii字元nul表示
為\0。
c中有兩種型別的字串。
單位元組字串(由char資料型別組成的序列)
寬字串(由wchar_t資料型別組成的序列)
wchar_t資料型別用來表示寬字元,要麼是16位寬,要麼是32位寬。
這兩種字串都以nul結尾。
警告 記住,null和nul不同。null用來表示特殊的指標,通常定義為((void*)0),而nul是乙個char,定義為\0,兩者不能混用。
警告
試圖用字元字面量來初始化char指標不會起作用。因為字
符字面量是int型別,這其實是嘗試把整數賦給字元指標。這樣經
常會造成應用程式在解引指標時終止:
char* prefix = '+'; // 不合法
正確的做法是像下面這樣用malloc函式:
prefix = (char*)malloc(2);
*prefix = '+';
*(prefix+1) = 0;
---------------------------
char *command;
printf("enter a command: ");
scanf("%s",command);//在使用的時候,再次之前沒有為其分配記憶體
下面這段**的字串記憶體情況
分配在全域性記憶體的字串會一直存在,也可以被多個函式訪問;
靜態字串也一直存在,不過只有定義它們的函式才能訪問
分配在堆上的內存在釋放之前會一直存在,也可以被多個函式訪問。
//字串第比較
char *p = "aaaa";
char *pp = "aaaa";
char *ppp = "bbbb";
printf("%d\n",strcmp(p,pp));p與pp相等
printf("%d\n",strcmp(p,ppp));p比ppp小
printf("%d\n",strcmp(ppp,p));ppp比p大
//strcpy字串的複製
char t="tt";
char tt="tsts";
strcpy(t,tt);//賦值陣列,將tt中內容複製到t中,為什麼用指標就不行
printf("%s\n",t);
char *ttt = "ttttttttttttttttt";
strcpy(tt,ttt);
printf("%s\n",tt);
/*strcpy的引數:
陣列,陣列
陣列,指標
但卻不能是:指標,陣列!!!!!!!!
//字串的複製注意字串的長度,是否越界
*/printf("字串的拼接\n");
/字串的拼接strcat
char c = "ccc" ;
char cc="aaa";
strcat(c,cc);
printf("這裡雖然列印出來了,但是有下面的迴圈可以知道陣列越界了, %s\n",c);
int i=0;
for(;i
}字串的拼接最好建立第三個字串,長度是要複製兩個字串的和,注意前乙個字串的\0
char* cd = "cd";
char* se = "se";
char* ccc = (char*)malloc(strlen(cd)+strlen(se)+1);
strcpy(ccc,cd);
strcat(ccc,se);
printf("%s",ccc);
//在拼接的過程當中,需要注意的是與字面量的拼接
char *p = (char*)malloc(2);
p = strcat(p,"\\");//因為\為轉移符號,所以上面只是乙個符號,但去有乙個\0需要注意
字串的返回
在函式內部通過malloc建立的字元陣列,呼叫者在適當的時候free掉
char* blanks(int number) s
paces[number] = '\0';
return spaces;
}.....
char *tmp = blanks(5);//要記得在適當的時候釋放掉tmp
int compareignorecase(const
char* s1, const
char* s2)
通過這個案例我們知道並不是只有通過malloc建立的字串需要手動的釋放記憶體,什麼樣的東西需要手動釋放記憶體,需要自己下面強化了解
問題:
字串字面量和字面量池
記憶體的釋放
乙個簡單的排序,函式名當做引數
#include
#include
暫時不知道這個是什麼意思,但是類似給函式去乙個別名
typedef
int (fptroperation)(const
char*, const
char*);
void displaynames(char* names, int size)
printf("\n");
}/fptroperation operation 用於接受乙個函式名的引數
void sort(char *array, int size, fptroperation operation) }}
}int compare(const
char* s1, const
char* s2)
/* 實現測試**
*/int main(int argc, char *argv) ;
sort(names,5,compare);//把函式名當做乙個引數來傳遞
displaynames(names,5);
printf("\n\n%d\n",compare);
}
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
C語言指標深入理解
前幾天看了乙個程式,裡面一段關於指標的 讓我非常糾結,看了很久才看懂,在這裡將將其記錄下來,希望能對大家有一定的幫助,先看示例程式 編譯器gcc include include include typedef struct list node list node,list,plist node st...