【c语言学习笔记二十四】指针及动态内存分配(malloc)

一、指针

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.

二、动态内存分配

内存分为静态内存(栈)和动态内存(堆),静态内存是系统分配的内存,不可更改,常量一般定义在此区域,动态内存为可变内存,因此变量存储在此区域。所谓的动态内存分配就是按照自己的想法分配内存,避免造成浪费。比如说我们定义了一个数组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;一样,不过指针自然有指针的用处。

发表评论

电子邮件地址不会被公开。 必填项已用*标注