言學(xué)習(xí)周記:第二周 指針與函數(shù)小結(jié))
C語(yǔ)言學(xué)習(xí)周記第二周 指針與函數(shù)小結(jié)這周終于碰上了C語(yǔ)言的核心——指針。從內(nèi)存地址開始一路干到指針、函數(shù)、內(nèi)存管理和字符串處理。上周是“會(huì)寫代碼”這周開始“看懂代碼在跟內(nèi)存干啥”。重點(diǎn)知識(shí)點(diǎn)指針就是存地址的變量每個(gè)字節(jié)都有編號(hào)拿地址*通過地址取數(shù)據(jù)。指針大小看系統(tǒng)32位4字節(jié)64位8字節(jié)跟指向啥類型沒關(guān)系。最坑的是野指針定義完不初始化直接解引用必崩。記住指針要么指向合法內(nèi)存要么給NULL。數(shù)組名≈首元素地址a[i]其實(shí)就是*(ai)下標(biāo)是指針運(yùn)算的語(yǔ)法糖。但sizeof(數(shù)組名)和數(shù)組名兩個(gè)特例要注意這時(shí)候數(shù)組名代表整個(gè)數(shù)組。二維數(shù)組用指針遍歷時(shí)p1跳一行還是一個(gè)元素取決于指針類型不確定就加括號(hào)。函數(shù)就是拆代碼形參是占位符實(shí)參是具體值各占各的內(nèi)存。C語(yǔ)言按值傳遞想改外部變量就得傳指針。遞歸就是函數(shù)調(diào)自己必須有退出條件不然棧溢出。階乘和斐波那契是經(jīng)典練習(xí)。內(nèi)存分棧和堆局部變量在棧上函數(shù)結(jié)束自動(dòng)回收。全局和static在數(shù)據(jù)段程序退出才釋放。堆歸你管malloc申請(qǐng)free釋放必須配對(duì)。忘了free小程序沒事大項(xiàng)目慢慢炸。字符串就是字符數(shù)組以\0結(jié)尾。strcpy/strncpy復(fù)制strcat/strncat拼接strcmp/strncmp比較strstr找子串strtok分割。帶n的有邊界控制更安全不帶的容易緩沖區(qū)溢出。sizeof算整個(gè)內(nèi)存大小含\0strlen數(shù)字符個(gè)數(shù)不含\0別搞混。心得這周最大的變化開始用“地址”和“內(nèi)存布局”的角度看代碼了。以前只關(guān)心“值是多少”現(xiàn)在會(huì)想“這變量放哪、誰(shuí)指著它、啥時(shí)候釋放”。老師說指針是C語(yǔ)言的精髓這周我真信了。遞歸像俄羅斯套娃一層層進(jìn)一層層出。但老師提醒別為了優(yōu)雅使勁遞歸層次太深棧撐不住很多場(chǎng)景用循環(huán)就行。踩過的坑野指針int *p; 不初始化直接 *p 10;秒崩。解決定義時(shí)就初始化int *p NULL;。返回局部變量地址函數(shù)里定義個(gè)局部數(shù)組return它的地址外面拿到的是廢數(shù)據(jù)——棧已經(jīng)被回收了。解決用static或者malloc。strcpy緩沖區(qū)溢出目標(biāo)數(shù)組10字節(jié)拷了個(gè)20字節(jié)的字符串進(jìn)去越界覆蓋了隔壁內(nèi)存查了半天才解決問題。解決用strncpy限制長(zhǎng)度??偨Y(jié)指針、函數(shù)、內(nèi)存管理是C語(yǔ)言的真·門檻。數(shù)組是指針的馬甲函數(shù)是模塊化基礎(chǔ)內(nèi)存管理決定程序穩(wěn)不穩(wěn)。這周信息量爆炸但多畫內(nèi)存圖、多調(diào)試慢慢就通了。下周繼續(xù)干指針進(jìn)階。