【顺序表】SqList *&L是什么意思

//顺序表基本运算算法
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType; 
typedef struct 
{	ElemType data[MaxSize];		//存放顺序表元素
   	int length;					//存放顺序表的长度
} SqList;						//顺序表的类型
void CreateList(SqList *&L,ElemType a[],int n)
//建立顺序表
{
	L=(SqList *)malloc(sizeof(SqList));
	for (int i=0;i<n;i++)
		L->data[i]=a[i];
	L->length=n;
    printf("L=%d\n", L);//此句仅测试使用,看一下L所指向的地址
}
int main(){
  SqList *Head = NULL;
  int a[5] = {1,2,3,4,5};
  CreateList(Head,a, 5);
  printf("Head=%d\n", Head);此句仅测试使用,看一下Head所指向的地址
  return 0;
}

有上面这样一段代码,CreateList函数中的参数SqList *&L是什么呢?实际上它是对结构体类型指针的引用,通常我们说函数的参数用&表示需要将传进去的参数“带回来”,比如下面代码:

#include <stdio.h>
int func(int &a){
  a = 5;
}
int main(){
  int x = 10;
  func(x);
  printf("x=%d", x);//输出结果为x=5
}

func参数为int &a,表示对整形变量的引用,即需要传入的参数需要为整形,结果将会被“带回来”,所以无论x值为多少,引用传参后值都会变为5。同理CreateList函数中的参数SqList *&L就是对SqList类型指针的引用,即main函数中无论SqList型指针Head原来指向什么(此处为NULL),传入CreateList后,与其中的L指向的都是同一个地址,通过两个printf可以进行验证。

如果去掉&,函数变为void CreateList(SqList *L,ElemType a[],int n)结果会怎样呢?

void CreateList(SqList *L,ElemType a[],int n)//仅将SqList *&L修改为SqList *L,其他均无变化
//建立顺序表
{
	L=(SqList *)malloc(sizeof(SqList));
	for (int i=0;i<n;i++)
		L->data[i]=a[i];
	L->length=n;
    printf("L=%d\n", L);//此句仅测试使用,看一下L所指向的地址
}

运行结果

可以看出不加引用,Head传入后仅仅相当于给L赋了一个初值,L指向的地址不会影响Head。

在单链表结构的定义过程中,严蔚敏版数据结构教材定义了结构体类型指针LinkList(typedef struct LNode *Linklist),所以在传递结构体指针的引用时,直接使用LinkList &L,而李春葆版本的数据结构教材没有这样的定义,传递参数使用LNode *&L

typedef struct LNode{
     ElemType   data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList; // LinkList为Lnode类型的指针

关于引用传递:

1、实际上引用相当于给变量起别名,比如下面代码,j是i的引用,也就是j是i的别名,它们实际上就是一个东西,所以无论修改哪一个,另一个都会跟着变。

int i = 5;
int &j = i;
j = 10;
printf("i=%d, j=%d", i, j);//得到i和j的值都是10

 2、传递引用给函数形参变化实参也发生变化,但是传递指针不一定,需要根据内部的操作具体判断。引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。

参考文章:https://blog.csdn.net/tingfengx/article/details/8787218

                  https://blog.csdn.net/weixin_30580341/article/details/98689928?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control&dist_request_id=c8fef2f1-72d2-4a36-95a4-6c3e78319eb6&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control

  • 36
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值