小白c++引用指针求解,,,

fxfxfxfxw 2016-10-31 07:54:20

#include<iostream>
using namespace std;
typedef struct node
{
struct node *leftChild;
struct node *rightChild;
char data;
}BiTreeNode;
void createBiTree(BiTreeNode *T)
{

}
int main()
{
BiTreeNode *T;
createBiTree(T);
return 0;
}

编译器会报错,提示指针没有被初始化
而引用指针就不会存在未被初始化这种问题,,请大大解释一下引用指针有什么用,原理~~

#include<iostream>
using namespace std;
typedef struct node
{
struct node *leftChild;
struct node *rightChild;
char data;
}BiTreeNode;
void createBiTree(BiTreeNode *&T)
{

}
int main()
{
BiTreeNode *T;
createBiTree(T);
return 0;
}
...全文
330 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
NoEdUl 2016-11-02
  • 打赏
  • 举报
回复

 BiTreeNode *T; //声明了一个指针T,是BiTreeNode类型
createBiTree(BiTreeNode *T) //传进去的参数是BiTreeNode类型的指针,确实没初始化。
createBiTree(BiTreeNode *&T) //传进去的是个啥呢。是通过引用(&)找到了T的内存空间,然后*表明这个空间是一个指针啊。
你的T有指向的内存空间,还有一个内存空间存这个T。 第二种方法传的是&告知“T在哪”,第一种方法传的是“T指哪”。
  • 打赏
  • 举报
回复
引用得到的是指针地址 你变量只声明不初始化就只有指针地址 编译器不知道你指针指向哪儿的 所以引用获取指针地址不会报错 而值的地址它找不到所以会报错吧
  • 打赏
  • 举报
回复
首先,指针是指向的地址。引用把这个地址传过去,和起初他的变量有或没有没有关系。 你直接用,没有初始化就是野指针,不知道指向哪,你操作一个不知道指向什么的东西肯定要报错
ri_aje 2016-11-02
  • 打赏
  • 举报
回复
引用 5 楼 qq_30265137 的回复:
[quote=引用 4 楼 ri_aje 的回复:] 用引用的时候 createBiTree 可以初始话指针(虽然你的 createBiTree 并没有这么做,但这种可能性还是存在的),所以编译器没有抱怨。传值的时候,没用这种可能,所以编译器能推断出指针肯定没初始化,因此跟你说一声。
第一个不是传递的是一个指针吗?那也可以在函数里初始化的啊~~或者是传递一个指针本质也是一个值传递?[/quote] 第一个传递的是指针的副本,函数内对参数任何的修改都发生在副本身上,本尊不会有变化,所以编译器能推断出调用端的指针一定没有发生变化。 第二个传递的是指针的引用,任何修改都能够带出来。
fxfxfxfxw 2016-11-01
  • 打赏
  • 举报
回复
引用 4 楼 ri_aje 的回复:
用引用的时候 createBiTree 可以初始话指针(虽然你的 createBiTree 并没有这么做,但这种可能性还是存在的),所以编译器没有抱怨。传值的时候,没用这种可能,所以编译器能推断出指针肯定没初始化,因此跟你说一声。
第一个不是传递的是一个指针吗?那也可以在函数里初始化的啊~~或者是传递一个指针本质也是一个值传递?
eziowayne 2016-11-01
  • 打赏
  • 举报
回复
引用就是变量的别名,这里就是参数T。相当于两个T就是同一个变量。至于为什么不会报错,那是因为传递引用进去编译器认为你要修改指针的指向;如果不采用引用那就是传地址,一个未初始化的地址对于createBiTree这个接口没有任何意义并且有导致程序崩溃的风险,所以编译器给你报错了。
赵4老师 2016-11-01
  • 打赏
  • 举报
回复
指针即地址 引用即别名
ipqtjmqj 2016-11-01
  • 打赏
  • 举报
回复
引用 5 楼 qq_30265137 的回复:
[quote=引用 4 楼 ri_aje 的回复:] 用引用的时候 createBiTree 可以初始话指针(虽然你的 createBiTree 并没有这么做,但这种可能性还是存在的),所以编译器没有抱怨。传值的时候,没用这种可能,所以编译器能推断出指针肯定没初始化,因此跟你说一声。
第一个不是传递的是一个指针吗?那也可以在函数里初始化的啊~~或者是传递一个指针本质也是一个值传递?[/quote] 对,传指针本身也是值传递,想要改变指针,要么传引用,要么是高一级的指针,比如原来是一级的,传二级指针 传二级指针这样传 void createBiTree(BiTreeNode **T) { } int main() { BiTreeNode *T; createBiTree(&T); return 0; }
ri_aje 2016-11-01
  • 打赏
  • 举报
回复
用引用的时候 createBiTree 可以初始话指针(虽然你的 createBiTree 并没有这么做,但这种可能性还是存在的),所以编译器没有抱怨。传值的时候,没用这种可能,所以编译器能推断出指针肯定没初始化,因此跟你说一声。
paschen 版主 2016-10-31
  • 打赏
  • 举报
回复
因为引用相当于是传递变量的地址,这个变量有没初始没有关系 如果不是引用传递的是值,这个变量没初始化,你就去使用他的值可能是未定义行为,所以编译器提示
勤奋的小游侠 2016-10-31
  • 打赏
  • 举报
回复
BiTreeNode *T = null; 那你就初始化一下呗
ipqtjmqj 2016-10-31
  • 打赏
  • 举报
回复
引用的话,就可以改变引用的变量的值了,否则只能使用,变量定义了没初始化直接使用,其值是不确定的,编译器设置的严格点就会报错,有时候只是一个警告

64,637

社区成员

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

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