事情起因:二叉树根节点在函数里赋值,怎么都赋不上。
目录
错误:指针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); }