【C语言学习记录05】存储类别和内存管理

前言

我本人也在慢慢学习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这本书,这书写的蛮不错的,大家自学的话有兴趣可以看看!
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super_Novaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值