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

一个关于指针关的问题

编辑:说三道四文库 发布时间:2017-07-22 12:47
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);
}

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

哦哦,我知道哪错了= =

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

谢谢大神的帮忙和鼓励
Unity CEO:不会因赌博游戏谋取金钱利益 云领域:且看亚马逊、Rackspace、微软及谷歌四国争霸 十一位EMC高管读2013技术趋势 你准备好了吗? Yahoo:拥抱Hadoop和HTML5 苹果聘女黑客为系统安全员 曾让Vista推迟发布 移动游戏定价之谜:0.99美金行不通 9.99美金和19.99美金才是王道 2012末日年:《时代》评选年度十大App 使用HTML5 Web存储实现离线工作 紧跟亚马逊、谷歌步伐 微软下调Azure云服务价格 云计算一周热点回顾:Hadoop专家分享大数据技术工具与最佳实践 Python之父Guido Van Rossum离开谷歌 一月加盟Dropbox 图灵奖获得者Butler Lanpson:计算机在做些什么 华为高级技术经理Anoop Sam John:HBase的二级索引 秦令今:技术是竞争的核心,形成自己的特色! 兰旭:拒绝同质化,做自己的真材实料! Cloud Foundry直面PaaS对手 初具商用能力 IndieBros访谈:探寻《2+18+200万》背后的故事 移动周报:生存还是毁灭 HTML5未来路在何方? 开发者的新机遇:微软生态系统打开开源大门 阻碍创新:谷歌、Facebook请求驳回抽象专利概念 Apple专利战分析:战火不停 创新不止 史上最牛独立开发者:花20美元狂赚100万美元 Twitter VS. Instagram:照片分享大战爆发 第二届“龙芯杯”中国开源软件设计大赛圆满落幕 TUP Masters第六期实录:Jeffrey Richter讲解Win8应用开发与.NET4.5 [简讯]Bootstrap 2.2.2发布 官博宣布新特性 我们正处于API的黄金时代吗? 敏捷开发的26条至理名言 12月10日:1815年首位程序员Augusta Ada出生 TOP30+应用排行榜:十一月国内外综合榜单 抱大腿:Square礼品卡服务进驻Passbook 如何给窗口增加一个timer事件 怎样执行加的对话框 public变量怎样声明 任何用beginthread写这段代码? 欢迎捧场,一个mm的论坛 windows2000 Professional作服务器可多少人同时访问? 在web应用程序里使用System.Windows.Forms.MessageBox.Show? 100分求助!Delphi中如何open一个含游标Oracle的过程,为什么总是“Error creating cursor handle” 关于数据库连接池的使用问题? 急,急,急,ODBC连接错误 怎样判断一个文件是否存在?怎样彻底删除一个文件? 错误处理,关于Exception急等 寻求:《com原理与应用》的电子版下载? 关于页面刷新的问题? 关于网络流量计算,紧急,在线等待,高手请指教 寻mp3控件,要能读取其tag信息. 请问如何将IE分成两部分,左边是一个APPLET写的tree,右边响应树中节点的事件(链接页面)? 如何才能得到本程序的cpu占有率?而不是总的cpu占有率? 如何编程枚举网上邻居 课件招标!!凡是我觉的有帮助的回答都给分!分不够可以再加!!先来100分!! 谁是高手?在线等待,立马给分! 发邮件问题 单挑高手:一个可变的字符串变量记录着类名(classname),怎么样根据这个符串的值创建所含信息的类实例?? 大放分!!!即放即給 一个在桌面上产生雪花的小程序,请帮忙修改。 请教一个程序速度的问题 辽宁沈阳的凯夫集团有知道情况的么? 好书是那本? 再请saucer(思归, MS .NET MVP),你帮忙得问题用你的方法解决了一半,还差一点。 关于界面控键问题! 为什么在设计时控件的属性不可以修改?在线等候 我的ROOT口令忘了,我该怎么办? 在RedHat8.0上安装Kylix3出现的问题?(关于文件包glibc检查出错)??????? VSS: Unable to check out the file <file> because it is already checked out. 一个暴难问题,关于两台电脑通过一个modem上网的问题。谢谢。 谁是高手,立马给分! 如何使ListControl 内容排序? 无法安装sql2000! 关于inport()和outport()的问题! 哪位仁兄手上有灰度图像的傅立叶变换和反变换的程序代码? 请教高手!死机问题 如何可以让网页内容置中显示,不管客户端的分辨率是多少? 大家注意Acrobat 5与BDE有冲突!! 怎样向客户端输出数据 如何判断一个变量是否定义过?使用if(var)的方法不行,报错 Interbase树形结构和递归调用问题,高手请进!!急!!!! 有谁知道哪有pb8.0汉化版出售。本人是个十足的英语盲! Oracle8 的blob字段,BDE读取报“Invalid Field Type”的错误 Interbase树形结构和递归调用问题,高手请进!!急!!!! 如何选出表中相同的纪录? 下面这些对编程风格的说法是否正确? 张柏芝林青霞张曼玉 女星青涩纯美的青孙俪成长史与"甄嬛"惊人相似 遇邓超总上春晚也不红的明星周星星,求求你嫁给我:盘点周星驰式银名人当众摔倒露底糗态百出孙杨李莹念亲密照曝光 恋爱拉响巨星陨少女时代宋茜尼坤金泰熙宋慧乔 韩国明王菲李亚鹏夫妇海外度假 甜蜜照曝光360度无死角女星 怎么拍都好看!明星有女初长成 谁家女儿最萌最有星象"刀锋战士"庭审被诉故意杀人 或被判名嘴收入大不同 或工薪收入 或入住千李湘晒沙滩比基尼性感照 似减肥成功李多海蔡琳金素妍 韩国当红女星整容失香港豪门恩怨大起底 圈子小三角恋多章子怡林志玲那英郭晶晶 明星令人抓狂那些迷人的韩剧女主角 你认识几个?细数无需PS的绝代佳人吓哭小孩被指少儿不宜 《西游降魔篇》女星旗袍争艳 谁穿出窈窕韵味?娱乐圈女星陪酒价目表曝光国际武术文化交流大会举行消防员为救车祸司机被切断4指远洋自然小区东侧有人养家禽雅馨家园小区中水井盖塌陷业余拔河赛玩出专业范儿“脑控汽车”在南开大学“开跑”捐赠者希望让真相永存国际武术文化交流大会举行跨文化研究新视域双桥西路南水沟变垃圾沟中国男篮下月初战俄罗斯邀请赛 随后赴京冀联手复制故宫珍贵藏画公益行动倡议“每周陪陪父母”难民安置引发意大利民众抗议全国报纸副刊评奖本报三连冠跨文化研究新视域扶老携幼大学生音乐节挖掘歌坛新生代可信度评价体系倡导健身廖理纯:种树治沙 心灵植绿
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘