没看出是伪代码,看上去都是C++代码
如果用指针,那么需要在函数外面先初始化SqList L本身,而函数内只是初始化L->elem
引用+指针,可以初始化SqList
形成栈帧就是esp-某个值之后形成新的栈顶,和栈底地址形成了一块内存空间,但是问题是,编译器为啥能知道,要减多少呢,要形成多大的内存空间的!!!
解释:编译器是有能力知道的,总所周知,C语言是有类型关键字的,比如:int double float等,还有一个关键字叫左sizeof可以求各个类型数据的大小,那么sizeof求大小,是在编译时求还是在运行之后求出来呢?
答案是在编译时,因为sizeof是关键字。不是函数!!!因为这一点,编译器就有能力,判断出栈帧该申请多大空间
伪代码如下:
//定义一个结构体,表示顺序表 typedef struct { int *elem; //用指针表示数据域 int length; //当前长度 int size; //当前占用空间 } seqList;
//初始化一个顺序表 void initList(seqList L, int arr, int n) { L->elem = (int)malloc(sizeof(int)n); //为数据域分配内存 L->length = n; L->size = n; for(int i=0; ielem[i] = arr[i]; //将传入的数组元素存入顺序表中 } }
解释:
在定义一个结构体类型 seqList,表示顺序表。
在结构体中定义了三个成员变量,分别是:elem(用指针来表示数据域)、length(表示当前长度)、size(表示当前占用空间)。
定义了一个 initList 函数来初始化顺序表,需要传入三个参数:一个 seqList 类型的指针 L,一个整型数组 arr,数组元素个数 n。
函数内部,首先为顺序表的数据域 elem 分配内存,大小为 sizeof(int)*n。
然后将顺序表的 length 设置为 n,将 size 设置为 n。
然后循环遍历数组 arr,将数组元素存入顺序表中。
关于图二的实现方式与说明:
形参需要定义指针变量是因为我们需要修改顺序表的值,而指针变量引用的是该变量的地址,可以直接修改变量本身的值。
实参需要加 & 符号是因为我们要传入该变量的地址,使指针变量可以引用该变量。
具体实现可以看上面的伪代码和注释。