数据结构基础——指针及动态内存分配(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;一样,不过指针自然有指针的用处。
相关文章推荐
- 数据结构基础:指针及动态内存分配(malloc)
- C语言编程基础-16动态内存分配 二级指针做形参 函数指针
- C/C++动态内存分配之用malloc和指针实现动态数组排序
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
- 局部变量全局变量和动态分配的数据分别在内存中存放的位置
- C和指针之动态内存分配常见问题和总结
- 通过malloc动态申请整形大小的内存,把地址强制转换成整形指针
- 关于动态内存分配和数组的选用(变长选malloc,定长选数组)
- 浅谈C,C++语言的基本数据类型的内存分配和指针的内存分配
- C++基础学习笔记----第五课(动态内存分配、命名空间、强制类型转换)
- 由动态分配和静态分配的数据在内存组成区别
- 学点 C 语言(23): 数据类型 - 给指针分配内存
- 数据结构基础(1)--数组C语言实现--动态内存分配(跟风追逐,加强突击)
- char ** str的使用方法:动态内存分配-------二维指针
- 【转】数据结构中栈和堆---内存分配中栈和堆
- 动态内存分配和指针
- 动态内存分配- new/delete 和malloc/free的区别
- 内存分配与数据格式化(malloc与new)