问题1:
关于C的指针:
下面是正确的代码:
typedef struct {
int data;
}SqList;
void InitList(SqList *&L){
L = (SqList *)malloc(sizeof(SqList));
printf("L initialized/n");
}
void DestList(SqList *L){
free(L);
printf("L destroyed/n");
}
void main(){
SqList *L;
InitList(L);
DestList(L);
}
其中void InitList(SqList *&L)
为什么是SqList *&L?
我改成SqList *L为什么就提示指针L没初始化?
void InitList(…………)里的参数性质不是应该和void DestList(…………)里的一样么?
答:
首先 这段程序不会报错是会警告
然后 你的程序逻辑 或者说程序思想有问题
void InitList(SqList *&L)这个函数是用来分配一个Sqlist的空间对吧
一般的方法是
Sqlist* InitList(){
Sqlist *L = (SqList *)malloc(sizeof(SqList));
return L;
printf("L initialized/n");
}
或者
void InitList(SqList *&L){
L = (SqList *)malloc(sizeof(SqList));
printf("L initialized/n");
}
这里SqList *&L 是对L的一个引用
下面来分析一下你的为什么有问题
主要的原因是你没有搞清楚函数参数的传递问题
比如 由函数定义void a(int* x);
然后调用时
int *b;
f(b);
这里面的x等于是f()里的一个临时变量 你调用f(b)是 是把b的值给了x 而不是X就是b了
所以对于你那个程序
SqList *L;
InitList(L);
这就相当于 将L中存的地址付给了 InitList()里的L(注意这两个L不是一个变量)然后你给InitList()里的L分配了一个空间 这丝毫不会影响
main()里面的L,main()里面的L以前啥样现在还啥样。
所以是用我说的第一种方法 正式把再InitList()里分配的空间地址 返回出来 返回给main()里面的L这样就达到目的了
而对于 第二种方法 SqList *&L 这是对L的一个引用也就是说 加上&后InitList()里的L和main()里的L就是一个变量了 当然你对InitList()
里的L改动也就相当于改动了main()里的L了
现在你明白了吗
(void DestList(SqList *L)这个函数因为他只是释放一个空间所以 给他个地址就行了他 释放你给他的那块地址对应的空间 而不去考虑这个地址
在哪个变量中存着)
关于指针的问题 本来就不是很容易理解 不过随着你进一步的学习和了解 你会柳暗花明又一村的