
在主函数传递一个 BinTree的指针过去(区别于传递变量,只是在不同地址赋值相同) 加上引用又有什么作用呢?
在Create函数里面 也是对BT指针进行的操作啊。
指针本质上不就是一个地址么?传送地址 与在Creat函数里面对这个地址的操作 加引用又有什么作用呢?
(然而经过我多次测试 必须加这个 & 引用的,不然是不对的。)
很是困惑啊。
同样还有一个 在链表的,是一样的情况。
既然typedef struct LNode {
ElemType data;
LNode * next;
}LNode, *LinkList;
那么 LinkList 就是 struct LNode 的一个指针类型啊,本质上就一个指针。
int ListCreate_L(LinkList &L) {
L = (LNode *)malloc(sizeof(LNode));
L = (LNode *)malloc(sizeof(LNode));
还有这句话 说明L 就是一个指针啊,
而在函数头上 却对 L 前面加个了 &(引用),不明白为什么这样操作。
(也经过多次测试了,不加这个&也是不对的)。
呜呜呜呜。。求解啊。
你看下下面的知识,再想想看。。。
要点:每块申请的内存都有它固定的首地址,而我们要做的就是将这个首地址告诉这个“外部指针”,但是这个“外部指针”必须满足以下其中一个条件
(1)传递的是指针的引用
(2)传递的是指针的指针
为什么直接传递指针不可以呢?我们看一个示例:
class A {
public:
A() { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
};
class Ex_AA {
public:
A _a;
};
void init(Ex_AA aa) {
}
int main(void)
{
Ex_AA aa;
init(aa);
}
输出:
A
~A
~A
请按任意键继续. . .
这就是我们常说的值传递了,从上面可以看到调用过程中会产生一个A的副本,结束后A的副本会释放掉。
所以如果是直接传递指针,调用完成后这个指针变量(也就是原指针变量的副本)会释放掉它所存储的地址信息,申请的内存地址仍然没有传递出去!
掉用的地方:
ListCreate_L(L); ----原L的地址,假设L的地址为0x12345678
掉用的函数:
int ListCreate_L(LinkList L) ----这里的L是原L的一个副本,假设此处L的地址为0x87654321
{
L = (LNode *)malloc(sizeof(LNode)); ---给L申请了内存
} -----出了大括号,申请的内存还存在,,但存储指针L的地址0x87654321将被释放掉。原L的地址0x12345678仍然为NULL!!!
用法:使用指针的引用或指针的指针来申请内存
int ListCreate_L(LinkList &L) ----这里仍然为0x12345678
{
}
int ListCreate_L(LinkList *L)
{
LinkList *LL = *L; ----同样为0x12345678
}