说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

一个关于指针关的问题

编辑:说三道四文库 发布时间:2018-08-19 05:22
HTML文档下载 WORD文档下载 PDF文档下载
首先是二叉树:
typedef struct node
{
int key;
struct node *lchild,*rchild;
}Pnode,*BTree;
void CreatTree(BTree &T,int n)
调用这个函数的时候是 
BTree T;
CreatTree(T,10);
接着是栈的
typedef struct node
{
int data;
struct node *next;
}pNode,*NODE;

typedef struct
{
NODE top,bot;
}stack,*Linkstack;
void CreatStack(Linkstack &s)
调用这个函数的时候是
Linkstack s;
CreatStack(s)


上面两个是我二叉树和栈的代码里截取出来的片段,
然后我发现,二叉树那样定义和调用是没问题的,
但是到栈那就不行了,运行的时候直接弹出个错误框,栈那里要改成
void CreatStack(Linkstack s)
stack s;
CreatStack(&s);
这样才不会出错,这样改我知道是没问题的,但是不明白的有两个
1.二叉树那里定义成 BTree &,直接把实参传进去却可以改变实参的值,
  而学指针的时候,实参把地址传给指针形参,这样就能改变实参的值了,但
  现在这样定义反而有种反过来的感觉,但也可以,这两种有什么区别?
2.既然二叉树那样定义成功,为什么栈那样定义却运行不到?

求大神教下小弟我
1.BTree &T叫做引用,可以理解成把实参直接传递到函数中了,没有拷贝副本
2.没看出什么问题,CreateStack内部的问题吧
引用 1 楼 a345485527 的回复:
1.BTree &T叫做引用,可以理解成把实参直接传递到函数中了,没有拷贝副本
2.没看出什么问题,CreateStack内部的问题吧

那你帮我看看
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE
{
int data;
struct NODE *next;
}QNODE,*Qnode;
typedef struct
{
Qnode top;
Qnode bot;
}STACK,*stack;

void Init(stack &s)//初始化
{
s->top=(Qnode)malloc(sizeof(NODE));
s->bot=s->top;
s->top->next=NULL;
}
void push(stack s,int e)//入栈
{
Qnode p=(Qnode)malloc(sizeof(NODE));
p->data=e;
p->next=s->top;
s->top=p;
}
void traverse(stack s)//遍历
{
    Qnode p=s->top;
while(p!=s->bot)
{
printf("%d ",p->data);
p=p->next;
}
}
void pop(stack s)//出栈
{
Qnode p=(Qnode)malloc(sizeof(NODE));
p=s->top;
s->top=p->next;
free(p);
p->next=NULL;
}
int main()
{
stack s;
Init(s);
}
记住,使用指针之前必须要初始化或者为它分配内存,
在主函数中定义的s是一个指针,而在Init函数中,你只为s->top(也就是QNODE)分配了内存,而没有为s自身分配内存
下面是改正过的:

void Init(stack &s)//初始化
{
s=(stack)malloc(sizeof(STACK));//给s分配内存
s->top=(Qnode)malloc(sizeof(NODE));//然后再给s->top分配内存
s->bot=s->top;
s->top->next=NULL;
}
引用 3 楼 a345485527 的回复:
记住,使用指针之前必须要初始化或者为它分配内存,
在主函数中定义的s是一个指针,而在Init函数中,你只为s->top(也就是QNODE)分配了内存,而没有为s自身分配内存
下面是改正过的:

void Init(stack &s)//初始化
{
s=(stack)malloc(sizeof(STACK));//给s分配内存
s->top=(Qnode)malloc(sizeof(NODE));//然后再给s->top分配内存
s->bot=s->top;
s->top->next=NULL;
}

可是当我换成
void CreatStack(Linkstack s)
stack s;
CreatStack(&s);
这种形式的时候,函数里面也没分配啊,但是程序运行的到= = 
还有,当我用stack定义s的时候不是系统就已经分配好内存了么? 
void CreatStack(Linkstack s) 这时把s复制一个
stack s;
CreatStack(&s);

不报错并不等于正确,你上面代码应该是什么也没做。你也没给CreatStack的源代码
引用 5 楼 buyong 的回复:
void CreatStack(Linkstack s) 这时把s复制一个
stack s;
CreatStack(&s);

不报错并不等于正确,你上面代码应该是什么也没做。你也没给CreatStack的源代码

我在回复给了代码了,我改成这样后,遍历,插入,都可以啊= =
举个简单的例子

typedef struct {
int val;
}A,*pA;

int main()
{
//下3行正常运行,
A a;
a.val=123;
printf("%d\n",a.val);

pA ptr;//定义指针
ptr=(pA)malloc(sizeof(A));//把这句和free(ptr)注释掉再看看
ptr->val=123;
printf("%d\n",ptr->val);
free(ptr);
}
引用 7 楼 a345485527 的回复:
举个简单的例子

typedef struct {
int val;
}A,*pA;

int main()
{
//下3行正常运行,
A a;
a.val=123;
printf("%d\n",a.val);

pA ptr;//定义指针
ptr=(pA)malloc(sizeof(A));//把这句和free(ptr)注释掉再看看
ptr->val=123;
printf("%d\n",ptr->val);
free(ptr);
}

嗯,果然分配真的不行,我就不明白了,我那个程序怎么没分配空间也不会出错= =
引用 8 楼 u013160932 的回复:
Quote: 引用 7 楼 a345485527 的回复:

举个简单的例子

typedef struct {
int val;
}A,*pA;

int main()
{
//下3行正常运行,
A a;
a.val=123;
printf("%d\n",a.val);

pA ptr;//定义指针
ptr=(pA)malloc(sizeof(A));//把这句和free(ptr)注释掉再看看
ptr->val=123;
printf("%d\n",ptr->val);
free(ptr);
}

嗯,果然分配真的不行,我就不明白了,我那个程序怎么没分配空间也不会出错= =

哦哦,我知道哪错了= =
引用 9 楼 u013160932 的回复:
Quote: 引用 8 楼 u013160932 的回复:

Quote: 引用 7 楼 a345485527 的回复:

举个简单的例子

typedef struct {
int val;
}A,*pA;

int main()
{
//下3行正常运行,
A a;
a.val=123;
printf("%d\n",a.val);

pA ptr;//定义指针
ptr=(pA)malloc(sizeof(A));//把这句和free(ptr)注释掉再看看
ptr->val=123;
printf("%d\n",ptr->val);
free(ptr);
}

嗯,果然分配真的不行,我就不明白了,我那个程序怎么没分配空间也不会出错= =

哦哦,我知道哪错了= =

加油吧,跨年还能静下心来编程,可赞
引用 10 楼 a345485527 的回复:
Quote: 引用 9 楼 u013160932 的回复:

Quote: 引用 8 楼 u013160932 的回复:

Quote: 引用 7 楼 a345485527 的回复:

举个简单的例子

typedef struct {
int val;
}A,*pA;

int main()
{
//下3行正常运行,
A a;
a.val=123;
printf("%d\n",a.val);

pA ptr;//定义指针
ptr=(pA)malloc(sizeof(A));//把这句和free(ptr)注释掉再看看
ptr->val=123;
printf("%d\n",ptr->val);
free(ptr);
}

嗯,果然分配真的不行,我就不明白了,我那个程序怎么没分配空间也不会出错= =

哦哦,我知道哪错了= =

加油吧,跨年还能静下心来编程,可赞

谢谢大神的帮忙和鼓励
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘