您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础——指针及动态内存分配(malloc)

2017-11-02 15:18 281 查看


一、指针

C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数。但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的它该指向谁的时候,我们就这样创建

int *a=NULL;
/* NULL表示的地址是0*00000000 也就是空,实际上,NULL就等于0,只不过用于指针时,通常用NULL,便于阅读。 */


指针它所指的地方就是一个地址,他本身也是个变量,所以它本身也是个地址,所以也有指向指针的指针,我们称之为二级指针,举个例子:

int a = 4;
int *p = &a;
int **ptr = &p;
printf("%d %d %d\n", a, *p, **ptr);


这段代码中ptr就是一个二级指针,最后输出的结果为4 4 4.

切记切记: 第一次定义时  代表是指针  (1)int
*p = &a;

                在非定义的情况下理解为取里面的内容(2)printf("%d
%d %d\n",
a, *p, **ptr);

两者都是*,但是*的意义不一样,(1)是定义,估带有*代表定义的指针,(2)是单独使用,代表取的意思,*p代表取P地址里面存放的内容


二、动态内存分配

内存分为静态内存(栈)和动态内存(堆),静态内存是系统分配的内存,不可更改,常量一般定义在此区域,动态内存为可变内存,因此变量存储在此区域。所谓的动态内存分配就是按照自己的想法分配内存,避免造成浪费。比如说我们定义了一个数组int a[600]但是,实际上我们要用到的只有100个int,那么

多余的空间创造出来就浪费了,而且在许多时候,我们并不知道最多要分配多少内存,所以,我们需要学习malloc函数来分配和释放部分内存。


三、malloc的用法

首先,malloc函数是在stdlib.h这个头文件里面的,所以需要加上这个头文件。

使用示例:

int *a;
a = (int *)malloc(20 * sizeof(int));
a[0] = 1;
a[1] = 2;
printf("%d %d\n", a[0], a[1]);
free(a);


这段代码是使用malloc创建20个int的示例,可能你认为这和int a[20];没有区别,但是注意到后面的另一个函数free,这是释放内存的函数,也就是说,分配的这个空间可能用不到了,那么久释放掉,好让剩余的空间继续为其他东西所用。(在有些编译器里,也可以free数组,但是不推荐大家这样用。)

学习上面的东西之后,我们就要学会使用结构体指针,下面是一个例子:

typedef struct NODE{
int data;
}node;
node *st=(node*)malloc(sizeof(node));
st->data=5;


st->data就是指指针st所指向的结构体中的data。就和非指针的node st;st.data=5;一样,不过指针自然有指针的用处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐