栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用头插法实例理解指针原理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用头插法实例理解指针原理

1.理解指针 1.1 指针含义


需要特别注意的是我们在定义一个指针后需要先将该指针变量指向NULL,即定义一个空指针,这样做是为了防止定义指针后该指针指向一陌生区域,导致使用指针时出现错误
指针类型需要与指向空间内值的类型相同

#include 

int 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 指针访问空间

"* "星号符为访问符,访问指针变量所指空间内的值

#include 

int 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;
}
2.理解malloc

(void *)malloc(unsigned int size)
1.该函数作用为在内存的动态存储区中分配一个长度为size的连续空间,此函数的返回值是一个指针(该指针类型与指向空间内值的类型相同),该指针指向该分配区域的起始地址,所以我们也可以理解为该函数会返回分配区域的起始地址
2.如果分配成功会返回指向分配区域的指针,若失败则会返回一个空指针
3.新的ANSIC标准规定该函数返回为void型指针,所以必要时要进行指针类型转换,如若想分配的空间内的值为int型,那么就需要(int *)malloc

3.结合头插法实例理解 3.1 定义单链表中结点类型

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.进行操作二,让头结点指向新结点

3.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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/889614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号