WHCSRL 技术网

结构体Sqlist L与Sqlist &L的区别

结构体Sqlist L与Sqlist &L的区别

Sqlist &L只可用于c++中;其中&表示引用的意思,而在C中&只表示取址,因此C++中下列顺序表插入函数中的L实际就是原结构体
1.证明Sqlist &L就是k:

bool ListInsert(SeqList &L,int i,ElemType e){
	if(i<1||i>L.length+1)
		return false;
	if(L.length>=L.MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1]; 
	L.length++;
	L.data[i]=e;
	printf("%%p
",&L);//对L取地址打印
	return true; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

证明,将ListInsert函数中的L进行取地址,将原结构体取址对比

int main(){
	SeqList k;
	int i=0,e=0;
	k.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);
	k.MaxSize=20;
	while(i!=15){
		k.data[i]=i;
		printf("%%d	",k.data[i]);
		i++;				
	}
	k.length=i;
	printf("%%p
",&k); //原结构体地址
	printf("please input the number and the position that you want to insert:
");
	scanf("%%d%%d",&i,&e);
	if((ListInsert(k,i,e))==true){
		printf("it is succeed and the result is:
");
		for (int j=0;j<k.length;j++)
			printf("%%d	",k.data[j]);
		printf("%%p
",&k);//插入操作后 原结构体地址
	}
	else{
		printf("Sorry ,insert is false!!!");
	}
	
	free(k.data);
	return 0;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

运行结果

在这里插入图片描述可见插入前 插入后和函数中的L地址都是同一个,得证&L就是结构体k;

2.证明Sqlist L与原结构体并非同一结构体但是具有回传功能。
对ListInsert 函数稍作修改

bool ListInsert(SeqList L,int i,ElemType e){
	if(i<1||i>L.length+1)
		return false;
	if(L.length>=L.MaxSize)
		return false;
	for (int j=L.length;j>=i;j--)
		L.data[j]=L.data[j-1]; 
	L.length++;
	L.data[i]=e;
	printf("%%p
",&L);//打印L地址
	for (int j=0;j<L.length;j++)//打印L数据
		printf("%%d	",L.data[j]);
	return true; 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果
在这里插入图片描述可见结构体K的地址插入前后并没有发生变化,而函数ListInsert的参数的结构体L地址却与k不同,证面Sqlist L是一个与原结构体相同的结构体,
如果采用该形式进行结构体修改,插入等操作时 ,当结构体数据量大时会增加电脑的额外开销。
结论: 记得点赞收藏