指针参数的传递??

thecrypig 2008-09-17 08:55:32
#include<iostream.h>

#include<malloc.h>

typedef char ElemType;

typedef struct node{

ElemType data;

struct node *lchild;

struct node *rchild;

}BTNode;

void CreateBTNode(BTNode *b,char *str){ //创建二叉树

BTNode *St[100],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL;

ch=str[j];

while(ch!='\0')

{

switch(ch)

{

case'(':top++;St[top]=p;k=1;break; //此时为左结点

case')':top--;break;

case',':k=2;break; //此时为右结点

default:p=(BTNode *)malloc(sizeof(BTNode));

p->data=ch;p->lchild=p->rchild=NULL;

if(b==NULL) //此时p指向根节点

b=p;

else

{

switch(k)

{

case 1:St[top]->lchild=p;break;

case 2:St[top]->rchild=p;break;

}

}

}

j++;

ch=str[j];

}

}



void main()

{

BTNode *b=NULL;

CreateBTNode(b,"A(B(D(H,I),E(J,K)),C(F(L),G))");//参数‘b’无法传递???、

cout<<b->data<<endl;
}

这是一个二叉树创建程序

CreateBTNode(BTNode *b,char *str){ }是正确的
参数b无法传递,为什么会这样,请各位教导?
...全文
113 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
信念 2008-09-17
  • 打赏
  • 举报
回复
指针悬空应该指new出来的指针delete后没有置为NULL
hooked 2008-09-17
  • 打赏
  • 举报
回复
不好意思,其实刚才说得有点偏了,这里的毛病主要是当b作为参数传进去的时候它的值为NULL,这就导致了在
BTNode* _temp_b = b;
之后,_temp_b也是NULL,于是它们之间就没有任何关系,到了最后,b还是NULL。
但如果b传参之前已经有了值,那么在函数里虽然b的值不会改变,但它所指向的内容却是可以通过_temp_b来改变的,因为它们指向了相同的地址。
我想,悬空指针指的是值为NULL的指针作为参数传递的情况吧。在这种情况下,它所指的内容也是不能改变的。
thecrypig 2008-09-17
  • 打赏
  • 举报
回复
感谢hooked 的热心解答,谢谢,也谢谢各位的无私帮助!!
hooked 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 thecrypig 的回复:]
好了 不过这个 *& b 是什么意思?指针的别名吗?


无法理解指针悬空的概念,或者说指针怎样才算开辟了空间,可以使用了??
[/Quote]

对,是指针的别命。
至于这里所说的指针悬空,可以这样理解:就好像
void swap(int a, int b); 和 void swap(int& a, int& b);
第一个是交换不了两个数的值的,因为编译器会做这样的工作:
int _temp_a = a;
int _temp_b = b;
然后把函数主体里的所有a,b都做相应替换。
在这里也是一样,如果不传引用的话,编译器会先执行:
BTNode* _temp_b = b;
然后把函数体里所有的b替换成_temp_b。所以到了最后,你的b并没有改变
thecrypig 2008-09-17
  • 打赏
  • 举报
回复
好了 不过这个 *& b 是什么意思?指针的别名吗?


无法理解指针悬空的概念,或者说指针怎样才算开辟了空间,可以使用了??
greatws 2008-09-17
  • 打赏
  • 举报
回复
写反了

void CreateBTNode(BTNode*& b,char *str){
thecrypig 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Zark 的回复:]

void CreateBTNode(BTNode *b,char *str){ //创建二叉树


void CreateBTNode(BTNode& *b,char *str){ //创建二叉树
[/Quote]

--------------------Configuration: aa - Win32 Debug--------------------
Compiling...
a.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\aa\a.cpp(17) : error C2528: '<Unknown>' : pointer to reference is illegal
C:\Program Files\Microsoft Visual Studio\MyProjects\aa\a.cpp(49) : error C2440: '=' : cannot convert from 'struct node *' to 'struct node ** '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
C:\Program Files\Microsoft Visual Studio\MyProjects\aa\a.cpp(179) : error C2664: 'CreateBTNode' : cannot convert parameter 1 from 'struct node *' to 'struct node ** '
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
执行 cl.exe 时出错.

a.obj - 1 error(s), 0 warning(s)

不行
thecrypig 2008-09-17
  • 打赏
  • 举报
回复
程序是我网上找的,评论里说 犯了指针未开辟空间就直接使用的错误,使指针再次悬空。

无法理解指针悬空的概念,或者说指针怎样才算开辟了空间,可以使用了??
Zark 2008-09-17
  • 打赏
  • 举报
回复

void CreateBTNode(BTNode *b,char *str){ //创建二叉树


void CreateBTNode(BTNode& *b,char *str){ //创建二叉树
fibbery 2008-09-17
  • 打赏
  • 举报
回复
编译没有问题,你的程序逻辑有问题!

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧