初学二叉树的初始化,为什么一定要定义一个指针型变量

根据视屏教程里的代码,第八行结构后定义了一个(星号)BiTree,但是程序里的所有二级指针变量前都加了取值符合(星号),不知道为什么要定义这个指针型的(星号)BiTree,于是稍作修改,将去掉并且整个程序只有一级指针,但是运行出错
请问原因是什么?

//以下是教学上的正确代码
#include <stdio.h>
#include <stdlib.h>
typedef char elemtype;
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//创建一颗二叉树,约定用户用前序遍历方式输入数据 
void createBiTree(BiTree *T)
{
    char c;
    scanf("%c",&c);
    if(' '==c)
    {
        *T=NULL;
    }
    else
    {
        *T=(BiTNode*)malloc(sizeof(BiTNode));
        (*T)->data=c;
        createBiTree(&(*T)->lchild);
        createBiTree(&(*T)->rchild);
    }
} 

void visit(char c,int level)//访问二叉树节点的具体操作 
{
    printf("%c位于第%d层\n",c,level);
}
//前序遍历二叉树
void PreOrderTraverse(BiTree T,int level)
{
    if(T)
    {
        visit(T->data,level);
        PreOrderTraverse(T->lchild,level+1);
        PreOrderTraverse(T->rchild,level+1);
    }
} 

int main(int argc, char *argv[]) {
    int level=1;
    BiTree T=NULL;
    createBiTree(&T); 
    PreOrderTraverse(T,level);
    return 0;
}

//**********************
//**********************
//**********************
//以下为修改后不能正常运行的代码
#include <stdio.h>
#include <stdlib.h>
typedef char elemtype;
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTree; 


void createBiTree(BiTree *T)
{
    char c;
    scanf("%c",&c);
    if(' '==c)
    {
        T=NULL;
    }
    else
    {
        T=(BiTree*)malloc(sizeof(BiTree));
        T->data=c;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
} 

void visit(char c,int level)//访问二叉树节点的具体操作 
{
    printf("%c位于第%d层\n",c,level);
}
//前序遍历二叉树
void PreOrderTraverse(BiTree *T,int level)
{
    if(T)
    {
        visit(T->data,level);
        PreOrderTraverse(T->lchild,level+1);
        PreOrderTraverse(T->rchild,level+1);
    }
} 

int main(int argc, char *argv[]) {
    int level=1;
    BiTree T;
    createBiTree(&T); 
    PreOrderTraverse(&T,level);
    return 0;
}
0

1个回答

对于一个函数,你修改参数变量,是不会影响调用者的。比如
void foo(int i)
{
i = 4;
}
int main()
{
int i = 3;
foo(i);
printf("%d", i); //还是3
}
那么要修改i怎么办?需要用指针:
void foo(int * i)
{
*i = 4;
}
int main()
{
int i = 3;
foo(&i);
printf("%d", i); //还是3
}
也就是你可以修改i指向的变量。但是如果你把这个指针同样视作是一个变量,它还是不能修改的。
void foo(int * i)
{
int j = 4;
i = &j; //这里修改的是i本身,而不是i指向的内存。
}
int main()
{
int i = 3;
foo(&i);
printf("%d", i); //还是3
}
而我们初始化的代码,需要在函数内分配内存,让指针指向这个新的地址,并且作用在原来的函数上,这个就要指针的指针。

总结下就是
变量 不能修改值
指针 不能修改指向,可以修改值
指针的指针,不能修改指向的指向,但是可以修改指向的指针
指针的指针的指针,不能修改指向的指向的指向,但是可以修改指向的指向
...
往下可以无限写下去。
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
指针使用前必须初始化
在指针的使用过程中,是最容易出现问题的。就像今天,我本来进行基数排序,但是,因为存储时用数组的,所以导致排序100000的时候,内存提示不足,因此,对于队列的使用,我就想到了使用链式存储。但是,当使用链式存储的时候,一直提示内存不足,把排序数目调到10的时候,也是如此,因此我想到了是程序改出了问题。 下面是定义的结构: typedef int DataType; typedef stru
常量指针必须初始化
常量指针必须初始化,常量指针必须在定义时就初始化,否则系统是会报错的。常量指针的指向地址是不允许进行修改的,如不在定义时初始化,系统随便提供的一个指针地址对于程序员来说没有占有感,就像用的个二手指针一样。 int *const p; // 错误,系统报错 int const *p; // 编译通过
指针变量初始化的重要性
自己声明了一个指针,但是没有初始化,成为了野指针,当程序打开后,不做任何操作,所以没有给该指针申请内存空间,当我直接关闭程序时,程序出现了异常中断,如下:由此可得,指针一旦被声明后,无论用不用,必须得先 将其置为空指针,避免成为野指针!!!由此可得,指针一旦被声明后,无论用不用,必须得先 将其置为空指针,避免成为野指针!!!由此可得,指针一旦被声明后,无论用不用,必须得先 将其置为空指针,避免成为...
【C】指针必须初始化吗??
定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。 如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。 int a; p=&amp;amp;a;//将p指向变量a,此时p的指向是确定的 当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位...
C++读书笔记—指针变量的定义与初始化
在了解指针变量与初始化之前,首先要弄清楚一点:什么是指针?1、指针的内容实际上是一个地址,我们只要给指针赋值一个地址,它将会指向这个地址表示的内存空间,这也是指针的作用,我们要访问某个地址时,这个指针必须合法,否则容易出现系统崩溃,从而出现段错误。比如一个指针指向11楼的某个房间,但是该楼层只有10层,若贸然进去,则会出现严重后果2、指针变量:就是指向某个内存地址的变量    char *p_ch...
指针的定义和初始化
每个指针都有一个与之关联的数据类型,该数据类型决定了指针所有指向的对象的类型。例如,一个int 型指针只能指向 int 型对象。 1.指针变量的定义      C++语言使用 * 号把一个标识符声明为指针:              vector   *pvec;         int        *p1, *p2;         string    *pstri
在java中变量一定要初始化吗?
在类中定义的成员变量如果你没有初始化java会自动帮你初始化,如果是数字会自动初始化成0,字符会初始化成'o',对象引用会初始化成null. 当然如果你定义的是局部变量就必须初始化了,否则编译会报错 这正是java的特点,极大的提高了代码安全性
swift中一个类定义一个属性必须初始化,如果不想初始化可以加?
-
java变量是否需要初始化的问题
程序里经常需要定义变量,但是是否需要初始化一直比较模糊,下面总结3种情况。 方法里面的形参变量: Java类方法,属于按值传递机制,调用方法的时候,完成参数的传递,相当形参被初始化。 局部变量 与成员变量不同,局部变量必须显示初始化,才能够使用。 成员变量 成员变量无需初始化,系统在创建实例的过程中默认初始化。
访问冲突的常见错之一————定义了一个指针变量没有初始化
PipeDamage.h文件中:CPipeDamageDlg *dlg; PipeDamage.cpp文件中:(初始化函数中)dlg = new CPipeDamageDlg(); 之前遇到过很多诸如此类的小错误
指针的定义、初始化、解引用
1.指针的定义和初始化 (1)&amp;a: 取地址符(单目运算符) a&amp;b: 按位与(双目运算符) *的三种用法: (1) 乘法:3*4=12 (2) int *p=&amp;a; //定义指针变量 (3) *p=100; //解引用 (2)int *p=&amp;a; //定义整型指...
类一定要定义拷贝构造函数,特别是在类成员含有指针的情况(不论指针是何种类型),安全!!!
举例说明一个未定义拷贝构造函数,产生的非常诡异的现象 using namespace std; class people  { private: char *name; int age; public: people(char *namestr,int i); /*people( const people& temp);*/ ~people(); char *getname(
java中局部变量必须要初始化的原理
问题可能很多java开发人员也没有注意到,java语言中的局部变量是必须要初始化的,但是这是为什么呢?分析现在假如你是java语言的开发者,你已经将对象保存在了堆内存中,而将局部变量保存在了栈内存中,你会怎么做呢?其实,不管是局部变量还是成员变量,都是必须要初始化的,那为什么成员变量会自动初始化?其实正是因为成员变量属于对象,而对象是保存在 堆中的,所以jvm就在初始化类的时候把成员变量初始化呢,而
C语言中指针定义的时候初始化的必要性
定义一个指针时,不进行初始化,系统会为这个变量自动分配一个地址,这个地址的值就是指针的值可能为0X1234,不初始化这个指针的值的话,操作这个指针就想当于操作这个0X1234这个地方的内容,就会出现问题,因为你并不知道这个指针指向地址的内容,可能为段系统代码,错改的话,可能会让系统崩溃。 比如 int *p; *p=100;让p这个指针指向地址的值为100,有可能这个指针指向地址的值为系统的一个重...
c++ 变量必须初始化吗???
1、局部变量必须初始化,否则其值未定义;   (1)、内置类型int,char,bool,float,double,指针、枚举enum等;   (2)、结构体、类、类模板等取决于它们自身的默认构造函数。类成员变量在对象创建的时候分配内存,如果在类中没有进行初始化,与局部内置类型结果一样;   (3)、STL库中vector、list、map等默认构造出一个空的容器。 2、全局变量   (...
C——指针一定要分配空间
分配空间指针一定要分配空间再使用,不然会坑死你自己的……include <stdlib.h> ... int *p=(int *)malloc(sizeof(int)); ...const char 和char char*类型可以完全代替const char*但const char*需要进行一定操作才可以转换为char *const_cast<type *>用来去掉const修饰//type *q
java关于局部变量必须初始化赋初值及成员变量不必须该操作的原理浅解析
一个我们编写的java源码类(机器码)要想被正式运行,必须先编译成字节码(class文件),然后虚拟机经过类加载过程后才能真正使用。 而这个类加载过程包括了对字节码  加载 验证 准备 解析 初始化等过程。在这个过程中,我们会对我们定义的成员变量进行两次初始化,一次赋默认初值(0值,boolean赋为false),一次赋我们定义的初值,如: class Test{ int a = 2; }
python初始及变量规则(一)
(一),python基础 1.第一句python * 后缀名是可以是任意 * 但是后缀名如果不是.py的话,导入模板时会报错 2.两种执行方式 * python解释器.py文件路径 * python 进去解释器,实时输入并获取到执行结果 (二),初始变量 变量定义的规则: · 变量名只能是字母,数字或下划线的任意组合 · 变量名的第一个字符不能是数字 · 以下关键字不能声明为变量名 [an...
对C++中指针声明和初始化指针理解之一
1.计算机需要跟踪指针指向的值的类型。char的地址与double的地址看上去没有两样,但char和double使用的字节数是不同的,他们存储时使用的内部格式也不同。因此指针声明必须制定指针指向的数据的类型。 int* p_updates; 如上实例:*p_updates的类型为int。由于*运算符被用于指针,因此p_updates变量本身必须是指针。我们说p_updates指向int类型,...
指针数组的初始化
const char *strings[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; 这是声明时初始化的清况,如果先声明,在初始化呢?我想当然的写成: const char *strings[7]; strings = {"Sunday","Monday","Tuesday","
使用指针数组时,要先初始化。
定义一个指针数组,因为是数组,所以会分配内存, 但是这个数组未初始化,因此数组里各个元素的值未知, 而数组里各个值是个指针,也就是说,这个指针指向的内存地址未知, 那么再向这个未知的地址所指向的单元赋值,有可能会报错,内存不能为read…… 建议还是再定义一个字符数组,给这个字符数组赋值,并把这个字符数组的首地址赋给这个指针…… 用strcpy函数编译通过,但运行报错         
c++指针变量(一)与void 指针
通过指针,可以简化一些C++编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。每一个变量都有一个内存位置,每一个内存位置都定义了可以用&amp;amp;运算符访问地址,它表示了在内存中的一个地址。 什么是指针:       指针是一个变量,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量的地址之前,对其进行声明。指针变量声明的一般形式为...
C++类的静态成员变量一定要初始化(分配内存)
文章转载自https://my.oschina.net/u/1537391/blog/219432 我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是赋一个初始值,而定义是分配内存。静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际...
什么情况下指针需要使用malloc分配内存,什么时候不需要
1.在c语言中,内存模型分为栈和堆。 2,这两种模型内存的方式是不同的,在栈中存放的变量是由系统自动管理的,在函数结束后系统会自动释放,不需要人为的进行任何操作。 3,而在堆中存放的是用户自己管理的内存,手动分配的,malloc建立,系统不会在函数体执行结束后自动释放,需要用户手动释放通过free函数。 当你对分配的空间进行自己的管理和释放需要使用malloc,或者当你的分配的空间在函数结束
关于全局变量的初始化问题与野指针
今天遇到一个小问题,声明一个全局的指针变量p1,并且通过malloc动态分配内存的方法,将一个1000Byte内存的首地址赋给p1,代码:char* p1=malloc(1000); 如下图: 但是使用 gcc 命令编译后报出如下错误(使用C99标准) 看了别人的博客后才知道是如下原因: c99标准中规定:全局变量和static变量的初始化需要指定一个常量,不能是一个非常量的表
变量为什么要进行初始化?
内存是在操作系统的统一管理下使用的! 1、软件在运行前需向操作系统申请存储空间,在内存空闲足够时,操作系统将分配一段内存空间并将外存中软件拷贝一份存入该内存空间中,并启动该软件的运行; 2、在软件运行期间,该软件所占内存空间不再分配给其他软件; 3、当软件运行完毕后,操作系统将回收该内存空间(注意:操作系统并不清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用。 综上所述,一个软
C语言指针未初始化情况
#include #include #include typedef struct node Node,*P_Node; struct node { int data; P_Node next; int *p2int; }; int main(void) { int a; int *p_int; Node node;
Qt指针变量的定义
指针变量的定义: ①若在其他函数中已有空间的分配,则只需将其指向该空间; EG: QFile *myFile; myFile = ....(); ②若作为自身使用,则要给他新分配一个空间 EG: QFile *myFile; myFile = new QFile(); myFile = ...();
指针使用前应先初始化
转载自:http://blog.csdn.net/lihaoweiv/article/details/7027521 使用未初始化的指针是非常危险的。通过一个未初始化的指针会很容易覆盖随机的内存区域。造成的损害取决于如何倒霉,所以初始化指针不仅仅是一个好主意。通过指向一个已经被定义变量的地址 很容易初始化一个指针。以下可以看到,通过使用运算符 & 及变量的名称来用变量number的地
关于结构体变量指针
程序中使用结构体类型指针引用结构体变量的成员,需要通过C提供的函数malloc()来为指针分配安全的地址。 最近在结构体上做了个实验: 声明一个结构体类型,如下: typedef struct {     int score;     char *str; }test; 然后定义一个结构体变量,一个结构体指针变量,如下: test a,*b; 对于结
结构体的初始化和引用及指向结构体变量的指针变量(C语言)
一、首先我们来了解关于结构体以及结构体数组的概念。 自定义结构体: struct weapon{ char name[20]; int atk; int price; }; 它是&quot;weapon&quot;型(类似于我们熟知的int型,String型等),里面有一个char类型,两个int类型。 如何给这个结构体赋值以及访问里面的属性? struct weapon...
C语言指针定义变量方式
用变量a给出下面的定义: 1、  一个整型数; int a;   2、  一个指向整型数的指针; int *a;   3、  一个指向指针的指针,它指向的指针是指向一个整型数; int **a;   4、  一个有10个整型数的数组; int a[10];   5、  一个有10个指针的数组,该指针是指向一个整型数的; int *a[10];   6、  一个指向有
为什么main函数中的变量必须初始化
public static void main(String[] args) {         // TODO Auto-generated method stub         new T1();         int t ;         System.out.println(t);//报错?!     }
Java中所有定义的基本类型或对象都必须初始化才能输出值
22. 下面代码的运行结果为:()import java.io.*; import java.util.*; public class foo{ public static void main (String[] args){ String s; System.out.println(&quot;s=&quot; + s); } }A 代码得到编译,并输出“...
C/C++变量默认初始化
分析了什么情况下,C/C++不给变量赋初值会报错,什么情况下系统会赋什么默认值。
C++ 单例模式中处理在类中声明一个指向一个自己的指针,在编译时显示定义的指针未定义的处理办法
参考博客:http://bbs.csdn.net/topics/10439749 #include #include "test.h" using namespace std; int main() { test *p = test::createtest(); return 1; } #pragma once class test { public: test(void);
Java中局部变量必须初始化【Java基础】
Java中有两种变量,局部变量和成员变量。 成员变量可以不进行初始化,虚拟机也会确保它有一个默认的值。 局部变量不能这样做,我们必须对它进行赋值,才能使用它。 int i;//为初始化 System.out.println(i);//编译器报错
const与指针及初始化
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性: *pa =d; // 不可行(d是已经声明过的整型
C/C++ 指向字符的指针为什么可以用字符串来初始化,而不是字符地址。
本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一、 C语言中,为什么字符串可以赋值给字符指针变量 char *p; a='5'; p=&a;                     //显然是正确的, p="abcd";              //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点!  
char* 指针初始化小练习
代码1: #include using namespace std; int main() { char* p2; p2="123456"; char* p="123456"; cout<<p<<endl<<p2<<endl; return 0; } 第一种: char* p="123456";//定义并初始化,这是推荐的格式,即使
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 深度学习是否一定要大数据 一定要学习java吗

相似问题

1
初学二叉树的初始化,为什么一定要定义一个指针型变量
1
python是不是永远无法调用c++的一个派生类的dll?
1
最近需要使用oracle数据库碰到一个不知怎么解决的问题,大神们帮帮我
2
各路大神!请问为什么我这个程序不能通过输入任意的字母来结束循环。
2
整数幂计算的一个程序
2
C语言基础疑问 代码最后的scanf为什么不执行?
1
序列比对程序中,总有一个unsigned char seq_nt4_table[256]的数组是做什么用的。
1
关于指针BOOL的问题。
1
刚在官网下载了一个devc ,每次用完关掉它之后,再想打开它,我都得重新安装一次 ,为什么呢???
2
用指针逆序输出数组,for循环打印不完全
2
c语言,是谁为变量分配相应的存储空间?操作系统还是编译系统?
1
C++ 写了一个二叉排序树的小程序,在牛客网OJ报错,请教一下各位。
1
关于C语言数组实现链表解决移动小球问题,明明是6个球为什么只输出了5个?
5
本人C语言小白,自己尝试做了一个关于数组的输入输出的程序,却输不出来
1
怎么用open来创建一个文件并往里面写内容呢?
2
不同端口号加入到同一组播地址,关闭套接字时为什么会有影响?
2
C++,main函数中放一个数组就超时,放外面就可以正常运行?
8
C语言中的变量自动转换问题
1
这个bmp的RGB转YUV,再用Y值输出灰度图为什么运行不出来?
1
给出一个n叉树,一个叶子节点值,不用递归,怎样求这个叶子节点的路径?