关于二级指针与c++中的引用

最近开始看数据结构。不过没有学过c++直接看数据结构。借了本书本也没有说用的是c还是c++语言进行描述。结果才刚开始看链表就遇到了很多问题。。。快哭了

下面这段代码是单链表里面尾插法建表的函数,是从《数据结构教程 第2版 》李春葆编里摘抄下来的:

#define ElemType int

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LinkList;

void CreateListF(LinkList *&L, ElemType a[], int n)
{
	LinkList *s, *r;
	int i;
	L = (LinkList *)malloc(sizeof(LinkList));
	r = L;
	for (i = 0; i < n; i++)
	{
		s = (LinkList *)malloc(sizeof(LinkList));
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
自己是在linux上面用的vim编辑器,用的是ddd调试器。

由于没学过c++,一看到行参列表我就慌了~~~~

void CreateListF(LinkList *&L, ElemType a[], int n)
*&L 这个是什么东西啊??
后来问了学长,才发现这厮是c++里面的货色 尴尬没学过c++的看数据结构伤不起啊

果断百度c++里面有关“引用”的知识点。下面这段话来自百度百科


引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。  

引用的声明方法:类型标识符 &引用名=目标变量名;

(1)&;在此不是求地址运算,而是起标识作用。  

(2)类型标识符是指目标变量的类型。  

(3)声明引用时,必须同时对其进行初始化。  

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。  ra=1; 等价于 a=1;   

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储   单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

(7)不能建立引用的引用,不能建立指向引用的指针因为引用不是一种数据类型,所以没有引用的引用,没有引用的指针

 例如:  int n;  

                        int &&r=n;//错误,编译系统把"int &"看成一体,把"&r"看成一体,即建立了引用的引用,引用的对象应当是某种数据类型的变量  

                        int &*p=n;//错误,编译系统把"int &"看成一体,把" *p "看成一体,即建立了指向引用的指针,指针只能指向某种数据类型的变量  

(8)值得一提的是,可以建立指针的引用  例如:  int *p;  int *&q=p;//正确,编译系统把" int * "看成一体,把"&q"看成一体,即建立指针p的引用,亦即给指针p起别名q。  注意:学会这种分析方法,把什么看成一体,又把什么看成一体  引用格式:一般在文章的注解中提到或在文中直接写出,也可以加引号(20字以下不用)

看看7.8点。这样上面的问题就懂了一半。再百度一下,找到下面这个例子还有人家的分析解释:

typedef struct term
{
 double coef;    //系数
 int expn;    //指数
 struct term *next;    //指向下一个结点的指针
}LinkList;
void Polynomial::CreateLinkList(LinkList *&L,double Coef[],int Exp[],int n)
{
 L=(LinkList *)malloc(sizeof(LinkList));
 L->next=L;
 LinkList *p,*q;
    p=L;
 int i;
    for(i=0;i<n;i++)
 {
        q=(LinkList*)malloc(sizeof(LinkList)); //创建新结点 
        q->coef=Coef[i];
  q->expn=Exp[i];
        q->next=L;
        p->next=q;
        p=q;
    }
}
LinkList *&L什么意思?L=(LinkList *)malloc(sizeof(LinkList));?

答:指针的引用而已,因CreateLinkList这个函数要修改链表,所以如果传一个指针类型的参数达不到修改目的的(因为传进去在函数里面改变的只是形参,实参没有改变。),所以用引用(c++里面独有的)。

举个例子,void swap(int i,int j)这个函数是不能真正达到交换两个实参的值的,明白吧?因为是值传递,所以只是交换了形参,实参没有变。但是void swap(int &i,int &j)就能交换了
指针也一样,如果想在函数里改变指针本身,就需要把形参类型设为指针的指针或者是指针的引用


那么我用c语言应该怎么来实现最开始那个创建链表呢?其实想通了很简单,只要传一个二级指针进去就可以了。

void CreateListF(LinkList **L, ElemType a[], int n)//形参列表是二级指针,故可以在函数里面改变一级指针(这里L存放的是头节点的地址)
{
	LinkList *s, *r;
	int i;
	*L = (LinkList *)malloc(sizeof(LinkList));
	r = *L;
	for (i = 0; i < n; i++)
	{
		s = (LinkList *)malloc(sizeof(LinkList));
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
以上是自己的理解。若有错误的地方还请大家指正。谢谢大家^_^






  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值