用《数据结构》(c语言版)(清华大学出版社,严蔚敏,吴伟民编著)教材,学习数据结构时遇到有关“&”符号使用的有关问题,及其困惑
用《数据结构》(c语言版)(清华大学出版社,严蔚敏,吴伟民编著)教材,学习数据结构时遇到有关“&”符号使用的问题,及其困惑?
我想大家在学习数据结构时,用的最多的还是那本清华大学出版社,严蔚敏,吴伟民两位老师合著的《数据结构》(c语言版)这本书吧。
我在用这本书学习的过程中,碰到了一个及其困惑的问题,“&”的在形参表中的使用问题,现以链表一节举例说明:
//------线性表的单链表存储结构------
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
但在以下函数接口中,我感觉经常多用了“&”符号,
Status InitList(LinkList &L);
Status DestroyList(LinkList &L);
按道理,LinkList已经是指针类型了,为什么以上两个接口中还是用了“&”符号?其实,本书还有很多函数接口中都是了“&”符号。
我知道这本书采用的类C语言增添了C++语言的引用调用的参数传递方式,在形参表中,就是以&打头的参数。
不知我遇到的此困惑,大家有没有,如何解释,是不是我的理解出错?
------解决方案--------------------
其实是传递指针的引用,否则会出问题,举个例子,
如果不用 & 的话:
//------线性表的单链表存储结构------
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//定义全局变量
LinkList g_List = NULL;
Status InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
}
//------------main--------------
void main()
{
InitList(g_List);//初始化g_List,g_List开始为NULL;
}
但是调用完该函数后 g_List还是为NULL,因为调用InitList(LinkList L)的时候,L是一个临时的参数变量,执行该函数相当于是 把该临时变量指向一个地址,但是g_List还是不变化,好象C语言中
int Num;
void Add(int a)
{
a++;//临时变量变化了,但是全局的Num 没有变化
}
所以必须有 &,这样是传递的引用,L表示g_List的别名,也就是g_List本身,没有临时参数变量,就是它本身,如果用C语言的话要改为
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(LNode));
}
好好体会吧~~
------解决方案--------------------
楼上两位说的都对
很多人都以为传了指针后,在函数内修改的任何东西都跟着修改了
其实能修改的只是指针所指向的内容,
如果指针本身被修改了,例如一个指针从指向链表的第一个元素变成指向链表的第二个元素,这样的修改就不能影响到外面
这时候在c语言中就要用到“指向指针的指针”,c++中有一个简单的替代——引用
------解决方案--------------------
我来回答啊……
这个你不要去硬要去理解他,因为数据结构这课,本来就只是教个方法,他传递有可能是个指针,有可能是个数,有可能是地址,要看具体的情况,书上这么写只是为了通用理解
------解决方案--------------------
回21楼:
我在脑子里面想阿,没有上机.这是考研指定教材,我才去看的,要不鬼才去看她老奶奶写的伪代码呢
c语言版本清华还有一本是不错的,作者忘掉了.
另外我主要使用C++,我要转化也是把C部分的转化成C++风格..
我建议你自己重写一遍就OK了,不要看她的书,就是只看思想,根据思想来编程
我想大家在学习数据结构时,用的最多的还是那本清华大学出版社,严蔚敏,吴伟民两位老师合著的《数据结构》(c语言版)这本书吧。
我在用这本书学习的过程中,碰到了一个及其困惑的问题,“&”的在形参表中的使用问题,现以链表一节举例说明:
//------线性表的单链表存储结构------
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
但在以下函数接口中,我感觉经常多用了“&”符号,
Status InitList(LinkList &L);
Status DestroyList(LinkList &L);
按道理,LinkList已经是指针类型了,为什么以上两个接口中还是用了“&”符号?其实,本书还有很多函数接口中都是了“&”符号。
我知道这本书采用的类C语言增添了C++语言的引用调用的参数传递方式,在形参表中,就是以&打头的参数。
不知我遇到的此困惑,大家有没有,如何解释,是不是我的理解出错?
------解决方案--------------------
其实是传递指针的引用,否则会出问题,举个例子,
如果不用 & 的话:
//------线性表的单链表存储结构------
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//定义全局变量
LinkList g_List = NULL;
Status InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
}
//------------main--------------
void main()
{
InitList(g_List);//初始化g_List,g_List开始为NULL;
}
但是调用完该函数后 g_List还是为NULL,因为调用InitList(LinkList L)的时候,L是一个临时的参数变量,执行该函数相当于是 把该临时变量指向一个地址,但是g_List还是不变化,好象C语言中
int Num;
void Add(int a)
{
a++;//临时变量变化了,但是全局的Num 没有变化
}
所以必须有 &,这样是传递的引用,L表示g_List的别名,也就是g_List本身,没有临时参数变量,就是它本身,如果用C语言的话要改为
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(LNode));
}
好好体会吧~~
------解决方案--------------------
楼上两位说的都对
很多人都以为传了指针后,在函数内修改的任何东西都跟着修改了
其实能修改的只是指针所指向的内容,
如果指针本身被修改了,例如一个指针从指向链表的第一个元素变成指向链表的第二个元素,这样的修改就不能影响到外面
这时候在c语言中就要用到“指向指针的指针”,c++中有一个简单的替代——引用
------解决方案--------------------
我来回答啊……
这个你不要去硬要去理解他,因为数据结构这课,本来就只是教个方法,他传递有可能是个指针,有可能是个数,有可能是地址,要看具体的情况,书上这么写只是为了通用理解
------解决方案--------------------
回21楼:
我在脑子里面想阿,没有上机.这是考研指定教材,我才去看的,要不鬼才去看她老奶奶写的伪代码呢
c语言版本清华还有一本是不错的,作者忘掉了.
另外我主要使用C++,我要转化也是把C部分的转化成C++风格..
我建议你自己重写一遍就OK了,不要看她的书,就是只看思想,根据思想来编程