首页 > 编程知识 正文

sqlist类型,seqlist和sqlist区别

时间:2023-05-05 23:30:38 阅读:160525 作者:4236

一.参见形参SqList *LSqList * L*L是指针,全名是指针变量,是用于保存存储器地址的变量。 这里是指向顺序表,存储顺序表地址的变量。

* L是指针类型的引用,引用是对c语言的重要扩展。 引用是原始变量的另一个名称(别名),引用变量本身没有自己的实际存储空间,对引用变量的操作就是对原始变量的操作。 此处的* L表示原始指针。

这两者有一个共同点,都指向顺序表l,用函数修正l的内容会影响l的内容。

不同之处在于,在函数中更改指针自身指向的地址不会更改*L,而是更改* L

首先,* L是引用类型的指针,表示原始指针。 在函数中对指针的操作是对原始指针的直接操作,指针的内容和指针指向的地址都会发生变化。

二、*L为什么不能改变函数中指定的地址呢? 其实,这里是函数形式参数和实际参数的基础,应该延伸到重要的知识点。

形式出现在函数定义中,可以在整个函数体内使用。 实参出现在主调函数中,进入被调函数后也不能使用实参。 函数调用时,主函数将实参的值传输给被调函数的形参,实现数据的传输。

然而,在该函数调用期间,数据传输是单向的,即数据仅从参与者传递到参考,而参考不返回参考。 也就是说,即使我们在函数中改变形状参数的值,实际参数的值也不会改变。 这就是函数调用中的单向传递。

那么,回到我们的*L吧。*L实际上是变量,这里是形式参数。 形式参数在函数中其实是实参数的副本。 也就是说,函数中形参数其实是另一个变量。 复制了原始变量的新变量与原始变量具有不同的内存空间,存在于函数中,在函数调用结束后立即释放内存空间。

也就是说,在函数中更改*L指向的地址不是更改原始变量,而是更改了原始变量的一个复制体,从而更改了复制体,但没有更改主体。

因此,函数不能更改在*L中指定的地址。

http://www.Sina.com/http://www.Sina.com /

# include stdio.h # include stdlib.h # define maxsize 50 typedefintelemtype; typedef struct { elemtype data [ maxsize ]; int length; }SqList; /*创建顺序表*/voidcreatelist(SQList*L,ElemType a[],int n ) intI=0,k=0; L=(sqlist* ) malloc (sizeof ) sqlist ); //地址while(in ) { 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 ); voidcreatelist(SQList*L,ElemType a[],int n ); 创建列表(list,a,n ); printf(list的数据的值为); for(intI=0; in; I ) printf('%d ',List-data[i]; printf (列表中的length的值为: ); 打印(% d (n ),List-length ); 返回0; }执行结果:

三、例子

# include stdio.h # include stdlib.h # define maxsize 50 typedefintelemtype; typedef struct { elemtype data [ maxsize ]; int length; }SqList; /*创建顺序表*/voidcreatelist(SQList*L,ElemType a[],int n ) intI=0,k=0; L=(sqlist* ) malloc (sizeof ) sqlist ); //如果在这里修改地址,List不会发生任何变化(while(in ) )、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 ); voidcreatelist(SQList*L,ElemType a[],int n ); 创建列表(list,a,n ); printf(list的数据的值为); for(intI=0; in; I ) printf('%d ',List-data[i]; printf (列表中的length的值为: ); 打印(% d (n ),List-length ); 返回0; }执行结果:

通过比较这两种方法,可以使用*L在CreateList函数中更改l的地址,以便打印输出中的值不再指向原始List。 另一方面,即使使用*L方式利用CreateList函数修改l的地址而利用主函数修改l的地址来对应,也可以打印输出与List对应的值。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。