建立顺序表-看代码:
/*建立顺序表*/
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