2017/8/22 勘误
下面阐述中出现了一个错误,在基础准备知识中 第3点。红色重点 描述错误。
首先,结构体指针赋值和普通指针赋值并没有区别。
指针在定义的时候,系统会分配一个4字节的空间(32位系统),任何类型的指针都是这样。这个空间用来存放一个地址值。
指针的类型是我们告诉编译器的,机器很傻,比如我们要使用指针指向的值,机器不知道目标地址后有多少个字节是我们
要使用的,这时候,就要靠指针的类型出马了。他会告诉cpu,我是int型,你给我往后面取4个字节。
指针在赋值的时候,比如 tail= pnew;如果不预先告诉你,这两个变量是指针,是不是就像普通的整型变量的赋值一样呢?
事实就是这样的,完全可以看做是int 型变量的赋值。
我的链表理解
1. typedef struct _LINK_NODE
2. {
3. int data;
4. struct _LINK_NODE* next;
5. }LINK_NODE;
下面我就来谈一下我今天的一些理解
LINK_NODE *head,*tail,*pnew;
基础准备知识:1、我们要理解结构体是一个 超级数组
功能比数组更强大,粗略上可以按照数组存放数据方式来类推
2、结构体指针是什么?比如 LINK_NODE *head,head里面存
放的是结构体首地址,可以类比数组。
3、结构体指针赋值怎么理解? 比如 tail = pnew; 解释起来就是
将pnew内的所有 数据 赋值到 tail里。不是改变tail指向的地址。
简单点说就是只是简单的数据复制粘贴。
第一步 :创建链表头
head = (struct student *)malloc(LEN);
此时 head内存放的是 申请的内存的地址
head->next=NULL;
tail = head;
第二步:申请新的内存空间
pnew = (struct student *)malloc(LEN);
//存入数据
pnew->next = NULL;
这是新申请的空间,将其next指空很容易理解,新创建的链后面肯定是空。
第三步:改上次尾部的指向
tail->next = pnew;
未赋值之前,tail->next 值为NULL,这是将新申请的空间串到尾部,理解起来很容易。到这里tail做为尾部使命已经结束,因为next已经有了指向,tail将会被赋予新值。
但是在内存中这个是什么样的操作困扰了我很久。下面我就来讲讲我的理解。
首先,我们要知道next里面放的什么,next放的是下一个链的地址,
只是一个地址的值,用图来描述一下
addr 0x957110 addr 0x0095e838 addr 0x00957110
data data data
next addr next addr next addr
0x0095e838 0x00957110 NULL
用指针操作这个 next addr 就可以操作下一个链的数据
tail = pnew;
上一次的尾部更新为现在刚刚申请的链。
至此,在链尾加入新值完成。