C语言笔记——指针的高级应用

动态存储分配

C语言的数据结构通常是固定大小的。例如,一旦程序完成编译,数组的元素就固定下来了。因为在编写程序时强制选择了大小,所以固定的数据结构可能会有问题。也就是说,在不修改程序并且再次编译程序的情况下无法改变数据结构的大小。
为了扩大数据库的容量,可以增加数组的大小并且重新编译程序。但是,无论如何增大数组,始终有可能填满数组。幸运的是,C语言支持动态存储分配,即在程序执行期间分配内存单元的能力。利用动态存储分配,可以设计出能根据需要扩大(和缩小)的数据结构。
虽然动态存储分配适用于所有类型的数据,但主要用于字符串、数组和结构。动态分配的结构是特别有趣的,因为可以把他们链接形成表、树、或其他数据结构。

内存分配函数
为了动态地分配内存空间,需要调用三种内存分配函数的一种,这些函数都是声明在<stdlib.h>头中的。
malloc函数——分配内存块,但是不对内存块进行初始化。
calloc 函数——分配内存块,并且对内存块进行清零。
realloc函数——调整先前分配的内存块大小。
在这三种函数中,malloc函数是最常用的一种。因为malloc函数不需要对分配的内存块进行清零,所以它比calloc函数更高效。
当为申请内存块而调用内存分配函数时,由于函数无法知道计划存储在内存块的数据是什么类型,所以它不能返回int类型、char类型等普通类型的指针。取而代之的是函数会返回void *类型的值。void *类型的值是“通用”指针,本质上它只是内存地址。

空指针
当调用内存分配函数时,总存在这样的可能性:找不到满足我们需要的足够大的内存块。如果真的发生了这类问题,函数就会返回空指针。空指针是“不指向任何地方的指针”,这是一个区别于所有有效指针的特殊值。在函数的返回值存储到指针变量中以后,需要判断该指针变量是否为空指针。

程序员的责任是测试任意内存分配函数的返回值,并且在返回空指针时采取适当的动作。师徒通过空指针访问内存的效果是未定义的,程序可能会崩溃或者出现不可预测的行为。

空指针用名为NULL的宏来定义,在6个头<locale.h>、<stddef.h>、<stdio.h>、<stdlib.h>、<string.h>和<time.h>中都有定义。只要把这些头中的一个包含在程序中,编译器就可以识别出NULL。当然,使用任意内存分配函数的程序都会包含在<stdlib.h>,这使NULL必然有效。
在C语言中,指针测试真假的方法和数的测试一样。所有非空指针都为真,而只有空指针为假,因此,语句 if(p==NULL)…可以写成 if(!p)… , 语句
if(p!=NULL)…则可以写成if ( p)…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

%Zero%

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

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

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

打赏作者

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

抵扣说明:

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

余额充值