需要特别注意的是我们在定义一个指针后需要先将该指针变量指向NULL,即定义一个空指针,这样做是为了防止定义指针后该指针指向一陌生区域,导致使用指针时出现错误
指针类型需要与指向空间内值的类型相同
#includeint main() { int a; a = 3; int *p=NULL; //定义一个int型指针变量,变量名为p p = &a; //将a的地址赋值给p,&为取地址符 //划分一块内存存放a的值,用变量名为这块内存命名,即可以通过变量名直接访问这块内存 printf("a的值为:%dn", a); //输出a的值为:3 printf("a的地址为:%pn", &a); //输出地址需要用%p占位符 //输出a的地址为:000000000062FE1C printf("p的值为:%pn", p); //输出p的值为:000000000062FE1C printf("p的地址为:%pn", &p); //输出p的地址为:000000000062FE10 return 0; }
当我们定义一个指针变量后,我们可以将该指针变量理解为地址箱,箱内可存放不同的地址,但是箱内只能存一个地址,可以这样理解指针即地址
1.2 指针访问空间"* "星号符为访问符,访问指针变量所指空间内的值
#include2.理解mallocint main() { int a=1; int *p1=NULL,*p2=NULL; p1 = &a; printf("p1的值: %pn", p1); //输出p1的值: 000000000062FE0C //不同指针变量之间可以相互赋值 p2 = p1; //现在p2内存放的也是a的地址,即p2也指向a printf("p2的值:%pn", p2); //输出p2的值:000000000062FE0C //* 符号为访问符,如*p即为访问p指向的空间,其值为p指向空间内的值 printf("a的值:%dn", a); //输出a的值:1 printf("访问p1指向空间,空间内的值为: %dn", *p1); //输出访问p1指向空间,空间内的值为: 1 return 0; }
(void *)malloc(unsigned int size)
1.该函数作用为在内存的动态存储区中分配一个长度为size的连续空间,此函数的返回值是一个指针(该指针类型与指向空间内值的类型相同),该指针指向该分配区域的起始地址,所以我们也可以理解为该函数会返回分配区域的起始地址
2.如果分配成功会返回指向分配区域的指针,若失败则会返回一个空指针
3.新的ANSIC标准规定该函数返回为void型指针,所以必要时要进行指针类型转换,如若想分配的空间内的值为int型,那么就需要(int *)malloc
typedef struct LNode {
ElemType data;
struct LNode *next; //定义struct LNode指针型变量,变量名为next,指针指向下一个结点即指针内的值为下一结点的地址
}LNode, *LinkList;
(typedef的作用为给定义的结构体类型起别名)
注意:
区分LNode *和LinkList用法,这两个都是指向结点的指针,但是一般强调这是单链表时使用LinkList,强调这是一个结点时使用LNode *,例如我们用LinkList创建头结点,其实是想强调创建了一个新的单链表,用LNode *创建新结点
3.2 了解头插法原理
头指针永远指向链表第一个结点,带头结点的链表中头结点是链表的第一个结点
1.指针s指向新结点,即此时的s内的值为新结点地址,可将
2.进行操作一,让新结点指向a1
3.进行操作二,让头结点指向新结点
创建头结点(创建链表第一个结点)
创建链表第二个结点
创建链表第三个结点
重复创建链表结点…
代码实现上述过程:
LinkList List_HeadInsert (LinkList &L) {
LNode *s; //定义一个结点指针类型,变量名为s
int x;
scanf("%d", &x);
L = (LinkList)malloc(sizeof(LNode)); //创建头结点,将头结点的地址返回给头指针L,即L指向头结点
L -> next = NULL; //初始化链表,此时链表为空
//开始为链表创建结点
while(x!=9999) { //设置循环条件,可不断插入新的结点
s = (LNode *)malloc(size(LNode)); //创建新结点,将新结点的地址返回给指针s,即s指向新节点
s -> data = x; //用x为s指向结构体内的成员data赋值
s -> next = L -> next; //操作一,使新结点内的next指向L所指向结点的下一结点 (s->next,s指向结构体内的成员next,而next是一个指针,该指针指向下一结点)
L -> next = s; //操作二
scanf("%d", &x); //为新结点data传入值
}
return L;
}



