这两个定义函数的方式有什么区别?希望大家可以帮忙看看?
#define MAXSIZE 1000
typedef struct{
ElemType data;
int cur;
}component,SLinkList[MAXSIZE]
void InitSpace_SL(SLinkList &space)与Status InitList(SLinkList space) 有什么区别,为什么两种方式能够达到相同的效果呢?语法上有错误吗?
数据结构
[解决办法]
我的理解,仅供参考:
(1)
类似定义函数指针类型,
typedef struct{
ElemType data;
int cur;
}component, SLinkList[MAXSIZE];
实际上将SLinkList定义为struct{ElemType data;int cur;}[MAXSIZE]这一数组类型,举个例子:
SLinkList array;实际上是定义了一个数组array,这个数组array包含MAXSIZE个元素,每个元素都是一个struct{ElemType data;int cur;}类型的变量
即上述定义实际上等价于struct{ElemType data;int cur;} array[MAXSIZE];
(2)
所以函数void InitSpace_SL(SLinkList &space)的参数实际上是一个数组的引用,这个数组必须是形如component array[MAXSIZE]中的array一样;而函数Status InitList(SLinkList space)的参数实际上是一个component类型的指针,在这一点上,类似于void fun(int a[])等价于void fun(int* a)。
实际上,编译器编译时会将两者变换成如下形式:
void InitSpace_SL(SLinkList &space) => void InitSpace_SL(component (&)[MAXSIZE]);
Status InitList(SLinkList space) => Status InitList(component* a);
这一点上,lz可以在两个函数里使用printf("sizeof(space) = %d\n", sizeof(space));进行验证,打印的结果前者应该是MAXSIZE*sizeof(component),后者应该是sizeof(int*)
(3)
两种方式能达到相同的效果,说起来与我们调用函数对数组进行操作类似,例如我们定义一个函数void fun(int a[MAXSIZE]),调用时我们将数组名作为实参,但是函数接收的形参只是一个指针,只不过这个指针指向实参数组的起始位置