SqList *&L与SqList *L的区别

//定义顺序表L的结构体
 2 typedef struct
 3 {
 4     Elemtype data[MaxSize];
 5     int length;
 6 }SqList;
 7 
 8 //建立顺序表
 9 void CreateList(SqList * &L,ElemType a[ ],int n)
10 {
11     int i;
12     L = (SqList * )malloc(sizeof(SqList));
13     for(i = 0 ; i < n ; i++)
14         L->data[i] = a[i];
15     L->length = n;
16 }
17 //输出线性表:
18 void DispList(SqList *L)
19 {
20     int i;
21     for(i = 0; i < L ->length; i++)
22         printf(“%d”,L->data[i]);
23     printf(“\n”);
24 }
复制代码

  SqList *LSqList * &L的区别:

概念:

     a.    *L是指针,全称是指针变量,是一个用来保存内存地址的变量。在这里是一个指向顺序表,存储顺序表的地址的变量。

     b.    * &L是引用类型的指针,引用是c++对c语言的重要扩充。引用就是原变量的别名,引用变量本身没有自己的实际存储空间,对引用变量的操作,就是在操作原变量。这里的* &L代表原指针。

异同点:

      两个的共同点,都指向顺序表 L 。

      不同点则是,在函数中修改指针本身所指向的地址,*L 不会发生改变,而* &L会发生改变。

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

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

      这里我们要巩固函数形式参数和实际参数的概念,这点最需要我们保持清醒。

      形参出现在函数定义中,在整个函数体内都可以使用。实参出现在主调函数中,进入被调函数后,实参也不能使用。在函数调用的时候,主函数把实参的值传送给被调函数的形参,从而实现数据的传送。但是,在这个函数调用的过程中,数据传送是单向的,即数据只能由实参传到形参,而形参不会传回实参。我们在函数中改变形参的值,实参的值是不会发生改变的,这就是函数调用中的单向值传递。

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

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

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

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

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

    

你可能感兴趣的:(SqList *&L与SqList *L的区别)