首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这两个定义函数的方式有什么区别?希望大家可以帮忙看看?解决方案

2013-11-25 
这两个定义函数的方式有什么区别?希望大家可以帮忙看看?#define MAXSIZE 1000typedef struct{ElemType dat

这两个定义函数的方式有什么区别?希望大家可以帮忙看看?
#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]),调用时我们将数组名作为实参,但是函数接收的形参只是一个指针,只不过这个指针指向实参数组的起始位置

[解决办法]
这个是c++的引用(SLinkList &space),你编写自然也就是c++。


结构在函数间传递的方法,c与c++ 是不同的。如果你不知道这一点,哪真是一个坑

[解决办法]
一个传引用,一个传值。
理论上前面那个会快一点,后面那个有拷贝(如果没有优化过)

热点排行