我们知道程序=数据的存储+数据的操作+计算机程序设计语言。 想要实现典型的数据结构,需要选择一门合适的编程语言。个人认为,C语言是一个很好的工具。C中的指针能很好的实现链表以及以链表为基础的树与图等。一些高级语言,如java,python没有指针的概念,实现典型的数据结构难免会有些变味。既然选择了C语言,那就讲讲想要用C语言实现数据结构需要的预备知识。主要分为三部分– 指针,结构体和动态内存分配
(Firefox浏览器,右键点击图片,选择view image即可查看高清大图。)
指针
指针的基本概念
- 指针与指针变量
变量在内存中分配到的位置叫做地址,也就是指针。 指针就是地址,地址就是指针。
指针变量 :存储另一个变量的地址的变量。(指针变量是通过寻址来找到另一个变量) - 指针变量的访问
- 直接访问
按变量地址来存取变量值 - 间接访问
通过存放变量地址的变量来访问变量
- 直接访问
- 指针变量的定义与初始化
【存储类型】 数据类型 *指针名 = 地址;
- 指针的初始化
除了上述的,用变量的地址来初始化指针变量之外,还有三种方法来初始化指针变量。
- 通过指针变量初始化指针变量
- 通过整型地址常量来初始化指针变量
int *p;
p = (int *) 0x23; - NULL或0
- 指针的初始化
- 基类型 与指针变量的大小
指针变量所指向的变量的数据类型为指针的基类型。尽管指针变量可以是不同的基类型,但指针变量的大小是固定的,是由计算机硬件所决定的。对32位系统来说,指针变量的大小为4个字节。想一想为什么?(因为32位操作系统地址总线宽度为32位,用4个字节可以遍历所有内存空间。又因指针就是地址,所以指针的取值范围与地址范围相同,故用4个字节可以表示所有可能的指针值。)
例如:
float *a ;
int *b;
上述两个语句定义了两个指针变量。第一个指针变量指向一个float类型的变量,第二个指针变量指向一个int类型变量。指针变量a的基类型为float,指针变量b的基类型为int。但是a和b的大小均为4个字节。(注意,int数据类型也为4个字节,所以可以通过整型地址常量来初始化指针变量)
- 指针与指针变量
常见运算—指针的运算就是地址的运算
- 赋值运算
例如:int a;
- 赋值运算