事情起因:二叉树根节点在函数里赋值,怎么都赋不上。
目录
错误:指针p是通过按值传递到函数中的,所以申请空间并赋值的只是 p 的副本 temp。
错误示例
void f(int* temp)
{
temp = (int*)malloc(sizeof(4));
*temp = 4;
}
int main(void)
{
int* p = NULL;
f(p);
if(p==NULL) printf("p is NULL");
}
输出为“p is NULL” 而为预想中的 4
解决:按地址传递/按引用传递 —— 参数上做文章
高级指针
实参取地址,形参作为高级指针。
void f(int** temp) //here
{
*temp = (int*)malloc(sizeof(int));
**temp = 4;
}
int main(void)
{
int* p = NULL;
f(&p); //here
if(p==NULL) printf("p is NULL");
else printf("%d",*p);
} 引用
void f(int* & temp) //here
{
temp = (int*)malloc(sizeof(int));
*temp = 4;
}
int main(void)
{
int* p = NULL;
f(p); //here
if(p==NULL) printf("p is NULL");
else printf("%d",*p);
} 错误:平级指针对目标指针进行赋值。
错误示例
int* p1 = NULL;
int* p2 = p1;
p2 = (int*)malloc(sizeof(int));
*p2 = 3;
if(p1==NULL) printf("p is NULL");
else printf("%d",*p1);
输出为 “p is NULL” 而非预想中的3
解决:
高级指针 指向 目标指针
int* p1 = NULL;
int** p2 = &p1;
*p2 = (int*)malloc(sizeof(int));
**p2 = 3;
if(p1==NULL) printf("p is NULL");
else printf("%d",*p1);
输出为3
指针类型引用 指向 目标指针
int* p1 = NULL;
int*& p2 = p1;
p2 = (int*)malloc(sizeof(int));
*p2 = 3;
if(p1==NULL) printf("p is NULL");
else printf("%d",*p1);
输出为3
错误例子:
typedef struct ABCD
{
char data;
struct ABCD* lchild;
struct ABCD* rchild;
} treenode;
void layer_create(treenode* root,deque& q)
{
q.push_front(root);
while(!q.empty())
{
treenode* new_node = q.front();//111
char data;
cin>>data;
if(data=='#'){
new_node = NULL;
}
else {
new_node = new treenode;//111
new_node->data = data;
q.push_back(new_node->lchild);
q.push_back(new_node->rchild);
}
q.pop_front();
}
}
void test()
{
layer_create(root,q);
}
两处错误:
root按值传递(指针也不行,因为指针和数据是绑定的,而非充当地址作用)
平级指针对目标指针进行赋值。
对于平级指针赋值错误:
//参数: deque& q; treenode* new_node = q.front();//1 new_node = new treenode;//2 这里我的想法:
步骤一 :通过new_node来改变 deque 里的指针的状态。
步骤二 :所以步骤二应是为deque里的指针申请一块内存。但很遗憾,我的做法是让new_node从指向 treenode 变成了 指向另一块内存。
但实际上只改变了new_node,对目标指针不会有任何改动。
解决:借助高级指针,或引用。
1.高级指针
2.利用1的高级指针调整。
void layer_create(treenode** root,deque& q) { q.push_front(root); while(!q.empty()) { treenode** new_node = q.front(); char data; cin>>data; if(data=='#'){ *new_node = NULL; } else { *new_node = new treenode; *new_node->data = data; q.push_back(&(*new_node)->lchild); q.push_back(&(*new_node)->rchild); } q.pop_front(); } }
改正1.引用
2.引用
void layer_create(treenode*& root,deque& q) { q.push_front(&root); while(!q.empty()) { treenode*& new_node = *q.front(); char data; cin>>data; if(data=='#'){ new_node = NULL; } else { new_node = new treenode; new_node->data = data; q.push_back(&(new_node->lchild)); q.push_back(&(new_node->rchild)); } q.pop_front(); } } void test() { layer_create(root,q); }