大佬救命!一个关于函数形参的基础问题

欠债的脱水橘猫 2020-09-19 09:04:40
各位走过路过的敬爱的大佬,本菜鸡知道这是一个非常基础的问题,但是本菜鸡实在是理解不了,所以请多指教.

[size=24px]先描述一下本菜鸡的理解吧,1. BiTree *l,BiTree *bt,在函数里面是结构指针变量类型的形参对吧
其后面函数调用中InitList(&bt);CreateBiTree(&bt); 是这么显示的,所以这两个函数的形参也就是地址
2. BiTree root,在函数里面是结构变量类型的形参,在其后主函数里面函数调用中显示PreOrder(bt);InOrder(bt);PostOrder(bt);
[/size]

[size=24px]所以我想问:1. BiTree *l,BiTree *bt,是用一个结构体指针变量去定义一个结构体指针变量*l,*bt的意思吗;
然后 BiTree root,是用一个结构体指针变量去定义一个结构体变量root的意思对吗?
2.请问BiTree *l,BiTree *bt,和 BiTree root在函数调用上有什么区别 ?我感觉好像是区别不大啊/size]


	typedef struct Node//结构体 ,Node为结构名 
{
} BiTNode,*BiTree;//一个是结构变量,一个是结构指针变量

void InitList(BiTree *l)//初始化
{
}

void CreateBiTree(BiTree *bt) //先序创建二叉树
{
}

void PreOrder(BiTree root)//先序遍历
{
}

void InOrder(BiTree root)//中序遍历
{
}

void PostOrder(BiTree root)//后序遍历
{
}

int main()
{

BiTree bt;
InitList(&bt);
CreateBiTree(&bt);
PreOrder(bt);
InOrder(bt);
PostOrder(bt);
}
...全文
81 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
typedef struct Node//结构体 ,Node为结构名 
{
} BiTNode,*BiTree;//一个是结构变量,一个是结构指针变量 //这里的理解是错的,不是变量,是类型,一个是结构体类型,一个是结构体指针类型


所以 BiTree *l 是二级指针,也就是指针的指针,因为BiTree本身就是指针类型,相当于 BiTNode** l,这是为了函数能返回初始化的指针,即 函数内改变 *l=XXX,函数外的 bt 的值也受影响
比如
int a=5
f(int *b) 要想在函数内改变*b,a也受影响,就要用一级指针(因为a本身是普通变量)

同样的
int *a = NULL;
f(int **b) 要想在函数内改变*b,a也受影响,就需要用二级指针(因为a本身是指针)

BiTree bt; //bt是指针,相当于BiTNode* bt
InitList(&bt); //所以这里要想在函数内改变*bt,外边的函数外的bt也受影响,就需要用二级指针,所以参数是BiTNode** 类型,即 BiTree* 类型

BiTree root 是一级指针,因为遍历函数里面不需要初始化指针,改变*root后往外传,所以用一级指针就可以了

所以,你的问题2,区别就是
用 BiTree *l,BiTree *bt,在函数内修改 *I 或 *bt,函数外的 bt 也受影响(一般这样的参数就是为了在函数内修改 *l 或 *bt)
用 BiTree root,再函数内修改 *root,函数外的 bt 不受影响 (一般这样的参数就是函数内不需要修改*root)
大佬万岁,很高兴在早上就能看到你的完美解答,我都要笑抽了,心中的阴霾一扫而光这简直不要太爽,大佬祝你今天依旧元气满满啊
qybao 2020-09-19
  • 打赏
  • 举报
回复
typedef struct Node//结构体 ,Node为结构名 
{
} BiTNode,*BiTree;//一个是结构变量,一个是结构指针变量 //这里的理解是错的,不是变量,是类型,一个是结构体类型,一个是结构体指针类型


所以 BiTree *l 是二级指针,也就是指针的指针,因为BiTree本身就是指针类型,相当于 BiTNode** l,这是为了函数能返回初始化的指针,即 函数内改变 *l=XXX,函数外的 bt 的值也受影响
比如
int a=5
f(int *b) 要想在函数内改变*b,a也受影响,就要用一级指针(因为a本身是普通变量)

同样的
int *a = NULL;
f(int **b) 要想在函数内改变*b,a也受影响,就需要用二级指针(因为a本身是指针)

BiTree bt; //bt是指针,相当于BiTNode* bt
InitList(&bt); //所以这里要想在函数内改变*bt,外边的函数外的bt也受影响,就需要用二级指针,所以参数是BiTNode** 类型,即 BiTree* 类型

BiTree root 是一级指针,因为遍历函数里面不需要初始化指针,改变*root后往外传,所以用一级指针就可以了

所以,你的问题2,区别就是
用 BiTree *l,BiTree *bt,在函数内修改 *I 或 *bt,函数外的 bt 也受影响(一般这样的参数就是为了在函数内修改 *l 或 *bt)
用 BiTree root,再函数内修改 *root,函数外的 bt 不受影响 (一般这样的参数就是函数内不需要修改*root)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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