剛換了公司,接觸到新公司的項(xiàng)目智能家居類似物聯(lián)網(wǎng)的東西,這和之前一直熟悉的應(yīng)用層大大的不同,其中有大量的 C/C++ 代碼,這讓我寫了一年多的 iOS 程序猿直接懵逼。周末就抽時(shí)間來復(fù)習(xí)復(fù)習(xí) C/C++。
C 語言中的字符串
首先需要明確的是,C 語言里沒有字符串這種類型。是通過字符數(shù)組來模擬字符串的,所謂的 C 風(fēng)格字符串就是以 '\0' 結(jié)尾的字符串。
C字符串的定義
由于使用字符數(shù)組模擬,所有就有以的方法
char buff1[] = { '1', '2', '3' }; // 單個(gè)字符賦值,不會(huì)在末尾補(bǔ)零,打印的話,則會(huì)輸出:123燙燙廳齀
char buff2[] = "123"; // 使用雙引號(hào)的話,則會(huì)自動(dòng)在末尾補(bǔ)零,輸出:123
char buff3[10] = { '3', '4', '5' };
char buff4[10] = "345"; //這兩種則會(huì)自動(dòng)監(jiān)測(cè)長(zhǎng)度加 '\0'
數(shù)組作函數(shù)參數(shù)
數(shù)組作參數(shù)會(huì)退化成指針,這樣就丟失了長(zhǎng)度信息,所以經(jīng)常就看到一個(gè)函數(shù)要求你傳指針和數(shù)組的長(zhǎng)度。
// 編譯器處理過程
func(char sourcr[10]) ----->func(char sourcr[]) ----->func(char *sourcr)
C語言的字符串存在什么區(qū)域?
內(nèi)存可以分為 stack(棧)、 heap(堆)、 global(全局常量區(qū))、 code(代碼段) ,在 C 中,stack、heap、global 都可以放字符串。
來看一個(gè)栗子:
//畫出以下各個(gè)變量的內(nèi)存示意圖
int main13()
{
char buf[20]="aaaa";
char buf2[] = "bbbb";
char *p1 = "111111";
char *p2 = malloc(100);
strcpy(p2, "3333");
}

內(nèi)存四區(qū)圖.jpg
值得一提的是,開辟數(shù)組就會(huì)將 heap 的 "aaaa" 拷貝到字符數(shù)組中,指針并不會(huì)指向 heap 中的 "aaaa" ,如上圖所示。