指针malloc分配空间与数组区别

指针malloc分配空间与数组区别

C语言中的数组:
C没有提供由语句来释放已静态定义的数组的措施。有以下几种情况:
定义在函数中的自动存储型数组,在函数被调用时创建,函数退出后自动释放;
定义在主函数中或所有函数之外的全局数组与程序的寿命一样长,不能中途释放;
用static修饰的静态数组,无论在何处定义,与程序的寿命一样长,不能中途释放;
用malloc函数申请的空间构成的数组,完成任务后可随时用free函数释放全部空间。

下面讲 malloc分配空间与数组区别:
严格的说给指针malloc分配空间不等于数组,但是可以认为它是个数组一样的使用而不产生任何问题。
不过既然这样,那它应该算是个数组吧。
所以,一般我们都用“动态数组”这种名字来称呼这种东西。

要讲清楚这个东西,涉及到malloc函数,指针类型和“[ ]”下标运算。

1、malloc函数:
malloc是C的标准库函数之一,用来分配动态内存。

一般来说,由C/C++编译的程序会在运行的时候在内存中占用一些空间,它们分为以下几个部分:
1.二进制代码区 不必过多解释了,就是放二进制代码的地方。
2.常量区 存放文字字符串和常量
3.静态存储区 存放静态和全局变量
4.堆空间 动态内存区,程序员可控制分配和释放的区域。
5.栈空间 由编译器分配内存用于存储函数参数和普通变量。

malloc能操作的是程序中的堆空间,而普通的数组则是存放在栈空间里面的。
由于操作系统对这两部分的内存管理模式差别很大,所以我们一般认为是不同的。

堆空间是系统内存中的可用区域,和普遍意义上的“堆(Heap)”不同,基本上可以看作是由空闲内存组成的大链表。
嘛,操作系统怎么处理这东西不管了,反正你就可以认为堆空间是可用内存里的一片连续区域。
malloc函数的作用就是从这一片内存中划出一块空间来。你可以认为是malloc从内存中找到了一片可以安全存放数据的可用空间,这样你的数据就可以放在这片空间里面。这片空间的大小是你自己指定的。通过malloc(字节数)这样简单的方法。

为了找到这片空间,malloc函数会告诉你这片空间开头的地址,你可以把它赋值给一个变量存放起来。
这样我们就知道申请到的这片内存的首地址(malloc返回)和大小(程序员指定)了。

2、指针类型:
C语言的指针也有类型,但是指针总是内存地址,是一个(32位/64位)二进制整数,长度也好大小也好都是确定的,理应一种类型就够了。那么,指针类型的作用是什么呢?其实指针类型就是用于判断指针所指向的数据的类型。

不得不说这是一个非常天才的设计。
指针里存放着的是一个地址,它能找到一个内存单元(复杂的东西不说了,操作系统都给你做了,你就认为是某一个字节就好。这个括号内部的东西写给某些较真的人看,实际上并不存在一种叫做内存单元的东西。),但是数据有长有短,数据们有些存在1个内存单元里面,有些存在多个内存单元里面。
指针是为了指向一个数据,那么,用什么方法可以知道这个指针想要的,到底是几个内存单元里的数据呢?

C语言里用了一种十分巧妙的设计——指针类型。一个指针指向一个字节地址,这个指针的类型所代表的数据结构是8个字节,那么我们就把这8个字节里面的东西都读出来,作为这个指针所指向的数据的值。

举个例子:比如说从地址是1000开始的内存是以下的一片样子:
00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000
00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000
然后我有个指针a,它的值是1000。
如果这个指针是int a。当我用a去访问数据的时候,就会返回【00000001 00000010 00000011 00000100】
这些数据。
但是如果这个指针是double a。当我用a去访问数据,返回的就是【00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000】这些数据了。

不过这个指针值可是没有变化的,变化的只是指针类型而已。

3、[ ]运算符:
[ ]运算符是C语言几乎最高优先级的运算符。[ ]运算符需要两个操作数,一个指针类型,一个整数。/补充[1]/
标准的写法是这样的:。这样编译器会返回 *(a+i) 的值。
这样做的话相当于一个十分好用的临时指针的移动。
如果我要访问第12个变量只需要写a[11]就好了。编译器会理解这个运算的规则,自动的把a指针进行一次以下的操作:
int *temp;temp=a+11;return *temp;
嗯,大概就是这个样子。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值