C语言学习周记:第二周 指针与函数小结
C语言学习周记:第二周 指针与函数小结
这周终于碰上了C语言的核心——指针。从内存地址开始,一路干到指针、函数、内存管理和字符串处理。上周是“会写代码”,这周开始“看懂代码在跟内存干啥”。
重点知识点
- 指针就是存地址的变量
每个字节都有编号,&拿地址,*通过地址取数据。指针大小看系统:32位4字节,64位8字节,跟指向啥类型没关系。最坑的是野指针:定义完不初始化直接解引用,必崩。记住:指针要么指向合法内存,要么给NULL。 - 数组名≈首元素地址
a[i]其实就是*(a+i),下标是指针运算的语法糖。但sizeof(数组名)和&数组名两个特例要注意,这时候数组名代表整个数组。二维数组用指针遍历时,p+1跳一行还是一个元素取决于指针类型,不确定就加括号。 - 函数就是拆代码
形参是占位符,实参是具体值,各占各的内存。C语言按值传递,想改外部变量就得传指针。递归就是函数调自己,必须有退出条件不然栈溢出。阶乘和斐波那契是经典练习。 - 内存分栈和堆
局部变量在栈上,函数结束自动回收。全局和static在数据段,程序退出才释放。堆归你管,malloc申请free释放,必须配对。忘了free小程序没事,大项目慢慢炸。 - 字符串就是字符数组
以\0结尾。strcpy/strncpy复制,strcat/strncat拼接,strcmp/strncmp比较,strstr找子串,strtok分割。带n的有边界控制更安全,不带的容易缓冲区溢出。sizeof算整个内存大小(含\0),strlen数字符个数(不含\0),别搞混。
心得
这周最大的变化:开始用“地址”和“内存布局”的角度看代码了。以前只关心“值是多少”,现在会想“这变量放哪、谁指着它、啥时候释放”。老师说指针是C语言的精髓,这周我真信了。
递归像俄罗斯套娃,一层层进一层层出。但老师提醒别为了优雅使劲递归,层次太深栈撑不住,很多场景用循环就行。
踩过的坑
野指针:int *p; 不初始化直接 *p = 10;,秒崩。解决:定义时就初始化,int *p = NULL;。
返回局部变量地址:函数里定义个局部数组,return它的地址,外面拿到的是废数据——栈已经被回收了。解决:用static或者malloc。
strcpy缓冲区溢出:目标数组10字节,拷了个20字节的字符串进去,越界覆盖了隔壁内存,查了半天才解决问题。解决:用strncpy限制长度。
总结
指针、函数、内存管理是C语言的真·门槛。数组是指针的马甲,函数是模块化基础,内存管理决定程序稳不稳。这周信息量爆炸,但多画内存图、多调试,慢慢就通了。下周继续干指针进阶。
