指针?引用?答疑解惑

很多同学当时学指针时,对其不以为意,但是到数据结构的时候,一堆指针窜来窜去的时候就显得懵逼了。所以现在写了一些解答,方便自己和其他小伙伴一起学习。这里主要以答疑解惑为主。
首先介绍取值和取地址符号,分别是* 与 &。
取值运算(指针p)返回保存在内存地址为p的内存空间中的值。取地址(&p)运算则返回操作数p的内存地址。显然可以用赋值语句对内存地址赋值。

答主还没有接触到编译原理、汇编语言等相关更深的知识,对于指针和引用也只能出于自己暂时的理解,有些欠缺还望包涵,等后期自学完这些知识以后再进行更深的探究!

这里主要针对的是数据结构中的指针。

问题1:为什么单链表需要有next指针?

答:我们都知道,申请单链表的时候,需要使用malloc来申请内存。如果就使用一次malloc的话,要求保存300个相同的结构。那么分配一个连续的内存块,通过数组符号(记录了首地址),就可以访问每个结构。但是如果使用300次malloc,要求存1个结构,则显然分配的内存不是连续的,这意味着这些结构不一定会被连续存储,因此,不能通过数组符号实现对每个结构的访问。
所以单链表就是看作不确定数目的计算。由于结构节点有 2 个数据成员:1.它存储的数据(int值)2.下一个位置的地址(*next)

typedef struct ListEntry { 
  Element element; 
  struct ListEntry *next; 
} ListEntry; 
 
ListEntry *list = NULL;  -- init the list to NULL to indicate "empty"

next 指针将指向包含列表中下一个条目的内存,如果在列表的末尾,则为 NULL。在链表中,值存储在不连续的位置。所以,我们需要在一个节点到另一个节点之间建立链接。所以为了指向下一个节点的地址,我们需要一个链表中的指针。

问题2:单链表为什么需要二级指针(指针的指针)?

typedef struct ListEntry { 
  Element element; 
  struct ListEntry *next; 
} ListEntry,*ListLink; 

无论什么类型,函数从实参到形参都是值拷贝,所以函数需要修改值作为入参的时候传递一级指针,需要修改指针作为入参的时候传递二级指针。所以只要记住,如果需要修改的话必须使用二级指针,如果不用则可以使用一级。例如下面:

void Creat(ListLink *L){
	(*L)=(ListLink)malloc(sizeof(ListEntry));//创造头结点
}

问题3:引用是什么?(没有C++基础只有C基础)

简单来说,就是地址的引用(在用scanf时你就用到&此符号,想必也有了解了)。通俗来说,指针指向一块儿内存,其内容为所指内存的地址;引用是某块儿内存的别名。引用必须指向有效的变量,指针可以为空。
下面通过链表来简单说一下。

void InitList(LinkList *L)//为什么需要二级指针,因为要改变
void InitList(LinkList &L)//简单来看,&和*作用相同
void InitList(LinkEntry *&L)//这种方法也很常见。

下面再通过函数交换来进行比较,可以很明显发现其中的不同,对于绝大多数人来说,指针是相当难以掌握的,掌握引用也是不错的选择。

void swap(int *x,int *y){
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;
}

void swap(int &x,int &y){
	int temp;
	temp=x;
	x=y;
	y=temp;
}

问题4:那指针和引用有什么区别呢?

首先讲一下对象的知识,对象是指一块能存储数据并具有某种类型的内存空间一个对象a,它有值和地址&a,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通过该对象的地址,来访问存储空间中的值。指针p也是对象,它同样有地址&p和存储的值p,只不过,p存储的数据类型是数据的地址。如果我们要以p中存储的数据为地址,来访问对象的值,则要在p前加解引用操作符"",即p。
你也可以把引用看做是通过一个常量指针来实现的,它只能绑定到初始化它的对象上。记住引用必须初始化、不能改变引用的指向

void fun1(Object obj)
{
     // 此函数声明中,obj是值传递,会产生一个临时对象
}
void fun2(Object &obj)
{
    // 我们不用检查obj是否为空,同时,使用引用传递,可以避免临时对象
}

总结一下:在平时学考中,还是以C语言指针为主,但如果是比赛(或者考研算法设计题中)尽量使用引用,因为指针的难点还是很高的,尽管目前接触了二级指针,但是对于其理解还是要消化的,毕竟,只有时间的磨练才能对指针产生真正的领悟!
感谢你可以看到这里,如果感兴趣的化不妨点个关注,三连一波哦,后期还有很多干货呢!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值