前言
我本人也在慢慢学习C语言,看的是C Primer Plus这本书,为了激励自己学习下去,所以会慢慢发分享一些学习心得,也当是记录一下吧,以后也好回顾回顾,本人很菜,高手们不要嘲笑,有问题欢迎指点或者交流,当然,我也可能不会......
正文
c语言能让程序员恰到好处的控制程序,但是考虑到效益最大化,程序员还得学会如何合理的使用内存存储数据,这是程序设计的一个要点。
当然,本人能力有限,学不学这部分都不会影响你去编写一个“人员信息管理系统”这种简单的项目 ,但是,学下来之后,给我最直观的感受就是,这个章节教会我什么叫做用最简短的代码实现更多的功能。
1.存储类别
1.1块
块简单的来讲是{....}之间。{.....}构成了一个块。例如,一个函数是一个块,一个if、while语句后面跟着{....}也是个块。
1.2作用域
作用域分为:块作用域、函数作用域、文件作用域。这里我们稍微解释一下块作用域和文件作用域
定义在一个块中的局部变量都具有块作用域。块作用域变量从可见范围的定义之初到包含这个变量的末尾,简单讲就是一个块内,从第一次出现到最后一次出现!
任何一个定义在函数以外的变量都是具有文件作用域的。
1.3链接
链接分为:无链接、内部、外部链接
在块内或者函数内定义的变量都是无链接的!
任何定义在函数外部的变量且没有static限制的都是外部链接
定义在函数外部且有static限制的都是内部链接
内部链接只能在这个文件中使用,外部链接是可以被extern引用到其他文件中去的!
1.4静态
静态大家可以理解成是无论有多少次的循环过程或者引用过程,static变量永远都是只定义一次
比如:
#include <stdio.h>
void trystat();
void main()
{
puts("测试开始!");
for (int i = 0; i < 3; i++)
{
puts("开始输出!");
trystat();
}
return 0;
}
void trystat()
{
int fade = 1;
static int stat = 1;
printf("fade = %d stat = %d\n", fade++, stat++);
}
结果是:
可以发现,每次调用函数时,fade都会被定义为1,而stat只有第一次定义为1,后面就开始自增
定义在函数外部的变量都是静态变量的,只不过通过是否有static判断是内部链接还是外部链接而已。
在同一文件的函数内使用这些变量要么不声明,直接使用,要么可以用extern先声明一下,如果在函数内重新定义了一个和外部一样名称的变量,那么在函数内部就无法使用外部的同名的变量了,同样,函数内部怎么折腾也不会改变外部同名变量的值。
如果跨文件使用的话,只能使用外部链接的变量,这里是要extern声明的!
extern同样还可以声明使用别的文件定义的函数的
为了方便大家学习,引入一张图
其中涉及到一些知识我没有写,比如存储期和存储类别的一部分,感兴趣的话可以自己看看书籍C Primer Plus,这部分我感觉还是有必要弄明白的,可以帮助自己理解C语言的书写规则
2.内存管理
2.1内存分配malloc()和内存释放free()
我们可以通过malloc去分配固定的内存给一个地址,使用结束后,我们可以使用free函数去释放这个地址,从而可以更高效的使用内存!
定义方式如下:
double* ptd;
int max;
scanf("%d", &max);
ptd = (double*)malloc(max * sizeof(double));
ptd是一个地址,我们通过malloc给ptd分配max个double类型字节的内存!
在使用完之后,我们可以铜过free(ptd)来释放这个地址所占用的内存。
如果我们不free()的话,会一直使用这个内存造成内存泄漏。
2.2calloc()
calloc()和malloc()是类似的,只不过内部参数的定义比malloc更加的美观了
使用方法如下:
ptd = (int*)calloc(n, sizeof(int)));
总结
这部分的知识对于我们非计算机专业的学生而言,日常使用机会不多,但是学习学习还是能帮助我们开阔视野和思路吧。
以上内容是本人一点学习记录,如有错误欢迎批评指正!
以上的例子出自C Primer Plus这本书,这书写的蛮不错的,大家自学的话有兴趣可以看看!