C语言指针个人浅见(涉及链表)

首先明确两个观点

  1. C语言在定义变量时会分配数据类型对应大小的内存空间;
  2. C语言在定义指针型变量时默认分配四个字节大小的空间,与指针所指向的数据类型无关;

再来回答几个问题:
1.结构体是什么?
答:结构体是用户自己定义的数据类型,和int,float,char等一样是一种数据类型。

2.指针所在内存空间上放的是什么?
答:是一串地址,指针所指向数据元素的首地址。

3.既然不管指向什么数据类型的指针分配的都是四个字节的内存空间,那么定义指向不同数据类型的指针有什么用呢?
答:定义指针时前面的数据类型表明存入这个指针变量的数据类型,前面说了指针存放的是首地址,指针指向的数据类型是为了告诉系统如何解析这串地址,就是说这个地址在被解析时到哪里结束,即指针指向的数据类型在内存中所占字节大小。

再来看链表
链表节点的定义

typedef struct LNode {
	int data;
	struct LNode *next;
}LNode, *Linklist;

LNode是指定义的链表这种结构体的数据类型
Linklist是指向链表这种结构体的指针数据类型

来看常见的几种定义

LNode L;//定义了一个链表节点,定义时分配了结构体大小对应的空间,&L等于空间的首地址
Linklist L;//定义了一个指向链表节点这种数据类型的指针,默认分配了四个字节的空间,L的值为空间首地址
//Linklist L; 等价于 LNode *L;

这种指针的作用是什么呢?
不同于顺序表,顺序表对应的结构体,定义一个结构体类型就是一张表。我们在使用LNode S;时,只是定义了一个链表节点S,一张表肯定不止一个节点,而我们不可能定义多个链表节点标量,那需要很多标识符,容易混淆。而链表访问的特性是通过第一个节点递推逐渐往后访问,也就是说,它并不需要对每个节点进行标识,这个时候malloc函数就来了。
学过C语言都知道malloc的作用是分配一段连续空间,并返回分配空间的首地址。

LNode *S;//定义了一个指向LNode类型的指针
S=(LNode *)malloc(sizeof(LNode));//申请了LNode类型大小的空间,并将返回的首地址强制转换成指向LNode类型的指针

未完待续。。。
个人浅见,望批评指正!

你可能感兴趣的:(指针,c语言)