SqList *&L与SqList *L的区别

SqList *LSqList *&L的区别:
*L:一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。

在这里是一个指向顺序表,存储顺序表的地址的变量。

*&L:是引用类型的指针,引用就是原变量的别名,引用变量本身没有自己的实际存储空间,对引用变量的操作,就是在操作原变量。这里的* &L代表原指针。
&:取地址
&L:把L的地址位置取出 例如L在ox30位置
*&L:相当于*(ox30)

共相同:都指向顺序表L
不同点:在函数中修改指针本身所指向的地址,*L 不会发生改变,而*&L会发生改变。

若要改变形参中的内容并且使用它则需要用引用,如果不需要改变子函数体中形参旳值,则不需要用引用。

* &L是引用类型的指针,代表的是原指针,我们在函数中对指针的操作,都是直接对原指针的操作,无论是指针的内容,还是指针指向的地址,都会发生改变。

形式参数和实际参数的概念:

在函数调用的时候,主函数把实参的值传送给被调函数的形参,从而实现数据的传送。但是,在这个函数调用的过程中,数据传送是单向的,即数据只能由实参传到形参,而形参不会传回实参。我们在函数中改变形参的值,实参的值是不会发生改变的,这就是函数调用中的单向值传递。

1、掌握引用的重点就是:在函数体当中改变了使用了引用的形参,实际上实参也跟着改变了,比如以上“建立顺序表的函数体”中的形参使用SqList * &L,倘若不使用引用,顺序表中的数据是不会存在的。
for(int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;

即这三行代码实际上是没有起作用的,所以在建立顺序表或者要对顺序表进行删除数据等等需要进行改变实参的操作时,都必须使用引用,只有使用了引用,形参才会传到实参。这就是为什么我们在输出顺序表的时候,函数体当中的形参SqList *L我们并没有使用引用,而只是用了指针,因为输出顺序表数据,我们并不需要做任何改变顺序表实体内部中的数据操作,而只是将其数据输出,在此函数体的形参中,我们可以尝试把形参加上引用SqList *&L实际输出效果是一样的。

引用最大的作用:就是它可以实现形参改变实参也随之改变,我们都知道普通形参只能是从实参传到形参,而加了引用的形参就可以实现形参在通过一系列函数操作以后实参也随之改变,它实现了形参回传到实参的作用。

2、我们来掌握一下*L为什么在函数中会改变不了所指向对象的地址呢?

*L其实就是一个变量,在这里是一个形式参数,属于指针传递。指针传递是在编译时是在栈中存放由主调函数传递进来的实参值(即实参的地址),也就是说形参指针是独立的一个指针,拥有自己的内存地址,它里面存储的是实参的地址,指向实参,形参指针与实参地址之间是两个独立的东西,当我们改变*L所指向的地址时,并不是在对实参本体做操作,而仅仅是改变了形参指针内部存储的地址值,当然也就改变不了实参的地址。

#include <stdio.h>
#include <malloc.h> 
#define MaxSize 50          
typedef char ElemType;
typedef struct
{
	ElemType data[MaxSize];    //存放顺序表元素
	int length;                //存放顺序表的长度
}SqList;                       //顺序表的类型
void GreateList (SqList *&L,ElemType a[],int n)//形参
{
	L=(SqList *)malloc(sizeof(SqList)); //相当于new出来一个sizeof这么大的空间,把它指向SqList这样的一个指针,把地址交给了L 
	for(int i=0;i<n;i++)
		L->data[i]=a[i];
	L->length=n; 
}
void DispList(SqList *L)
{
	for (int i=0;i<L->length;i++)
		printf("%d ",L->data[i]);
	printf("\n");
}
int main()
{
	SqList *sq;            //定义一个指向SqList的地址,要不然地址怎么过来 
	ElemType x[6]={5,8,7,2,4,9};
	GreateList(sq,x,6);   //实参 在sq的这样的顺序表中,插入x一维数组,一共六个元素 
	DispList(sq);
	return 0;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值