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