关于typedef可以理解为定义数据类型结构的一个描述。elemtype也是一样,不过前者是定义存储结构,比如结构体,后者是定义数据类型,比如int这些(可以代指所有数据类型)。
在使用elemtype之前可以定义typedef int elemtype,也就是说elemtype是int类型。
①typedef int status,status是函数返回值类型,当返回值类型是函数结果状态码时(true ,ok这些…),函数定义为status类型。
使用时status Test{};
②typedef int Getelem个人理解为把int类型改名为Getelem。只是改了名字本质还是int类型。
③typedef struct Book{};定义了一个结构体且结构体名字为Book。
另一种写法是typedef struct{}B;
——————————————
关于&L和*L
二者都是参数传递的两种方式,不同的是前者不需要占用新的空间,相当于给了一个新的名字,指向的还是用一个空间地址。而后者需要新的空间。
float a,b,*p1,*p2;
p1=&a;
p2=&b; //p1,p2存的是a,b的地址
swap(p1,p2);//ab交换
int i=5;
int &j //j是一个引用类型,代表i的一个替代名。当i改变时 ,j也跟着改变。i和用的是一个地址
——————————————
对于Elemtype *elem和Elemtype elem[maxsize]
前者是定义了一个数组elem(数组是特殊的指针),数组名表示的是这个数组的第一个元素,那么*elem存的是开辟的这块空间的基地址。这是动态分配空间的方法。后者是静态开辟空间的方法。
这里的*elem是一个polynomial类型的数组,也就是指向上边polynomial结构体的指针。
这个polynomial结构体有两部分,一个系数一个指数,是多项式中某一项(pi,ei)的表示,这个*elem中就是存的就是这个多项式各个项的顺序存储结构。也可以理解为一个个的polynomial结构体通过指针塞到了数组中且每一个结构体有两项(数组长度由后边的length决定)。可以用elem[i]方式访问其中的元素。
简单理解就是第一个polynomial结构体定义了一种数据元素,有两个部分,后边sqlist把这些polynomial结构体构建成一个线性表,*elem存的是这个表的首地址(数组直接存的是具体的数据,前边加*就表示这个数组的元素的地址),length是这个表的长度。访问表中元素时采用elem[i]的方式。
———————————————
动态分配内存方法补充
sqlist L
L.elem=(elemtype*)malloc(sizeof(elemtype)*maxsize)
malloc(m)表示开辟m字节长度的地址空间并返回这段空间的首地址。
(elemtype)*maxsize)表示这种数据类型的字节长度✖️元素个数,就是需要开辟的空间大小。也就是从内存找到这么多的空间。
而(elemtype*)表示强制转换。开辟了这么多的空间怎么划分?就是通过(elemtype*)处理,比如我们需要int型,那就是把这么多的空间转换为int类型。
为什么elemtype后边有*,是因为我们在sqlist结构体中定义的数组是*elem的指针类型的数组,所以我们要转为指针类型。(结构体中只定义了*elem,并未给实际的地址,这里开辟了实际的空间才算赋给了*elem地址)。
free()表示释放指针p所指变量的存储空间,彻底删除一个变量。(但是只能删除空间,不能删除指针,所以要置指针为null)。
————————————————
c++动态分配内存
int *p1=new int或者int *p1=new int[10]
等号后边表示从内存中开辟了一块空间,得到的是地址,所以要给一个指针类型的变量,指向新开辟的空间的地址。
————————————————