C语言访问一个结构体

定义一个结构体如
typedef struct {
QElemType *base;
int front;
int rear;
int queuesize;
}SqQueue;
在有个初始化的方法

void InitQueue(SqQueue& Q)
{
Q.base = (QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType));
.......

}
main方法
int main()
{
QEIemType d;
SqQueue Q;
InitQueue(Q);
......

}

这样就会报错
11 E:\Files\Document\C\dcp2.c syntax error before '&' token
E:\Files\Document\C\dcp2.c In function `InitQueue':
13 E:\Files\Document\C\dcp2.c `Q' undeclared (first use in this function)
......
如果改成
void InitQueue(SqQueue *Q)
{
Q->base = (QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType));
.......

}
main方法
int main()
{
QEIemType d;
SqQueue Q;
InitQueue(&Q);
......

}
就可以
我知道为什么可以。
不明白怎么不可以啊有的书上就是那样写的啊。

第1个回答  2014-02-14
//在C语言里,&用于取地址,没用声明参数的用法,你这样用“SqQueue& Q”是不合法的
void InitQueue(SqQueue *Q)//SqQueue *Q是定义SqQueue类型的指针,与&Q的类型相同,
{
Q->base = (QElemType*)malloc(QUEUE_INIT_SIZE*sizeof(QElemType));
.......

}
main方法
int main()
{
QEIemType d;
SqQueue Q; //其它结构体没什么复杂的,除了要自己定义之外,与其它系统提供数据类型的用法是一样的
InitQueue(&Q);//Q是结构体,加&就是到Q的地址,这里你可以把Q当作一个普通参数,在InitQueue函数里把Q当作指针对待。InitQueue函数里的Q与main里的Q不是一样的。
......

}
第2个回答  2014-02-14
InitQueue(Q);
void InitQueue(SqQueue& Q)
这样是没错的,错的是编译环境不对。
函数参数带&是表示引用,这是c++中特有的,而c语言中没有这个特性,所以你肯定是在c的编译环境编译的,要在c++的编译环境下才能用c++的特性,可以用vc++ 6.0或vs2005试试本回答被提问者采纳
第3个回答  2014-02-14
你函数定义的形参是SqQueue * 而你实参传的是个SqQueue肯定错了,最起码类型不兼容。至于第二个你实参传的是SqQueue *,所以当然没问题了。使用函数的时候切记形参和实参的类型必须一样。追问

void InitQueue(SqQueue& Q)

意思是不能写这样的参数SqQueue& Q ?

追答

可以 当然可以 不过你使用函数的时候传实参必须跟形参的类型一样。
函数定义的时候SqQueue &Q 和SqQueue *Q是一样的。

相似回答