SqList * &L和SqList * L的区别

建立顺序表-看代码:

/*建立顺序表*/
void CreateList(SqList * &L,ElemType a[],int n)
{
    int i=0,k=0;
    L = (SqList *)malloc(sizeof(SqList));
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
 }
/*建立顺序表*/
void CreateList(SqList * L,ElemType a[],int n)
{
    int i=0,k=0;
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
    printf("%d\n",L->length);
 }
一、区别1
  • SqList * &L 将指针作为函数的参数,同时使用了c++函数参数传递中的引用传递,* &L为指针的类型引用,引用即为给另一个变量起一个别名
int i,j;
int &a = i;  a为引用名,i为被引用的变量名
j = 10;
a = j;   等价于 i = j
  • Sqlist * L 将指针作为函数的参数,* L是指针变量,一个用来保存地址的变量。在这里是一个指向顺序表,存储顺序表的地址的变量。
二、共同点
  • SqList * &L 和 SqList * L均为将指针作为函数的参数进行传递
  • 都指向顺序表 L ,如果在函数中修改L 的内容,都会影响到 L 的内容
  • 以下的两种方式对L的修改结果相同:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50

typedef int ElemType;

typedef struct
{
    ElemType data[MaxSize];
    int length;
}SqList;

/*建立顺序表*/
void CreateList(SqList * &L,ElemType a[],int n)
{
    int i=0,k=0;
    L = (SqList *)malloc(sizeof(SqList));
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
    printf("%d\n",L->length);
 }

int main()
{
    SqList * List;
    ElemType a[10]={1,2,3};
    int n = 10;
    List = (SqList *)malloc(sizeof(SqList));
    void CreateList(SqList * &L,ElemType a[],int n);
    CreateList(List,a,n);
    printf("List中data的值为: ");
    for(int i=0;i<n;i++)
        printf("%d  ",List->data[i]);
    printf("List中length的值为: ");
    printf("%d\n",List->length);
    return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50

typedef int ElemType;

typedef struct
{
    ElemType data[MaxSize];
    int length;
}SqList;

/*建立顺序表*/
void CreateList(SqList * L,ElemType a[],int n)    //区别一:此处使用指针
{
    int i=0,k=0;
        //区别二:并没有重新分配地址空间
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
    printf("%d\n",L->length);
 }

int main()
{
    SqList * List;
    ElemType a[10]={1,2,3};
    int n = 10;
    List = (SqList *)malloc(sizeof(SqList));
    void CreateList(SqList * &L,ElemType a[],int n);
    CreateList(List,a,n);
    printf("List中data的值为: ");
    for(int i=0;i<n;i++)
        printf("%d  ",List->data[i]);
    printf("List中length的值为: ");
    printf("%d\n",List->length);
    return 0;
}
resoult.png
三、区别2
  • 在函数中修改指针本身所指向的地址,* L不会发生改变,* &L会发生改变
  • * &L是引用类型的指针,代表的是原指针,我们在函数中对指针的操作,都是直接对原指针的操作,无论是指针的内容,还是指针指向的地址,都会发生改变。
  • *L是一个拷贝的过程,我们在函数中改变 *L 所指向的地址,不是在对原变量进行改变,而是对原变量的一个复制体进行改变,改变了复制体,却没有改变本体。
    wireframes.png
/*建立顺序表*/
void CreateList(SqList * &L,ElemType a[],int n)
{
    int i=0,k=0;
    L = (SqList *)malloc(sizeof(SqList));     ********修改了地址
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
    printf("%d\n",L->length);
 }
resoult.png
/*建立顺序表*/
void CreateList(SqList * L,ElemType a[],int n)
{
    int i=0,k=0;
    L = (SqList *)malloc(sizeof(SqList));     //******如果在这里修改地址,则List不会发生任何变化
    while(i<n)
    {
        L->data[k] = a[i];
        k++;
        i++;
    }
    L->length = k;
    printf("%d\n",L->length);
 }
resoult.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,140评论 1 32
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,536评论 1 51
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,905评论 0 38
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,473评论 3 44
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,849评论 2 9