最近写二叉树的数据结构实验,想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个例子讨论一下c语言中指针作为形参的函数中传递中隐藏的东西。

大家知道C++中有引用的概念,两个数据引用同一个数据,那么更改任意的一个都相当于更改了本体,那么另一个数据所对应的值也会改变,可是C中是没有这个概念的。所以就产生了一些东西。和我们本来想的有差别。

一、明确C语言中函数的入口:

C语言中函数的形参负责接收外部数据,那么数据究竟怎么进入函数的呢,其实我们在函数体内操作的形参只是传递进来参数的一个副本,也就是说这两个参数虽然名字一样,对应的值一样,但是他们两个对应的内存地址是不一样的,也就是说这就是两个“看上去一模一样”的完全不同的变量。

所以一定要知道,C语言中函数是值传递的,也就是说,C语言只能把值传给函数,而不能把你想要传递的变量完全的放进函数内部。

二、指针传递给函数:

指针作为一个特殊的东西,他的强大之处就在于指针可以直接修改内存地址上的数据。虽然指针特别强大,但是他也难逃函数的限制,你传递给函数一个指针,因为是值传递,那么你在函数体内的使用的形参指针也只是一个副本,只是一个指向的值和你传进来的那个指针一样的一个另外的一个变量。也就是说他和普通常量是没有区别的。

三、我想要达到引用的效果怎么实现

C语言中因为是值传递的,那么我们就传递值,只要讲想要传递进函数的东西的地址传进函数,并且函数用一个指针接收,那么就相当于把这个变量地址原封不动的传递给了函数,形参的指针指向的是外面传进来的地址,有了地址不就好办了吗。

四、下面是我写的一个二叉树建立的一个无返回值的版本:

因为二叉树是用递归建立的,就像建立链表一样,一个节点一个节点建立,如果不获得上一个节点的地址,你怎么把链表连接起来呢,链表就散开了。

所以只能通过传递地址来达到找到已经建好的链表的前驱,才能把各个节点穿起来。

#include <stdio.h>
#include <stdlib.h>typedef struct tree {char t;struct tree *lchild;struct tree *rchild;
}Tree;void initTree(Tree **T) {char ch;ch = getchar();if (ch == '#') {*T = NULL;}else {*T = (Tree *)malloc(sizeof(Tree));(*T)->t = ch;initTree(&(*T)->lchild);initTree(&(*T)->rchild);}
}void qianT(Tree *T) {if (T) {printf("%c ",T->t);qianT(T->lchild);qianT(T->rchild);}
}int main (void) {Tree *T;initTree(&T);qianT(T);return 0;
}

注意看树的建立那个函数,我每次都是穿进去一个节点的地址,然后通过地址来找到已经建立好的树,才能将树建立起来。那么有的人会问了?为什么不是下面这个写法呢?

void initTree(Tree *T) {char ch;ch = getchar();if (ch == '#') {T = NULL;}else {T = (Tree *)malloc(sizeof(Tree));T->t = ch;initTree(T->lchild);initTree(T->rchild);}
}

这种写法,你每次传进来的都是一个变量,说过,c语言是值传递的,那么每次你申请的节点空间都是给副本申请的,然后递归的是副本的左右孩子,也就是说你的树根本没有建立起来,因为每次申请的内存都没有连接上。
       为什么我的那个写法可以呢,因为我是用一个指向指针的指针来存地址的,我给传进来的地址申请了内存,也就相当于给穿进来的那个节点本身申请了内存,而不是给副本,所以二叉树就顺其自然建立起来了。
       最后记住,c语言是值传递的,任何东西传递给函数的都只是值!

C语言中函数和指针的参数传递相关推荐

  1. C语言中函数和指针的參数传递

    C语言中函数和指针的參数传递 近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家 ...

  2. C语言中函数参数传递

    C语言中函数参数传递的三种方式 (1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值. (2)地址传递,就是 ...

  3. C语言中函数参数传递的方式:值传递,地址传递

    ** C语言中函数参数传递的方式:值传递,地址传递 ** 值传递:将实参的值复制至形参的相应存储单元中,实参与形参占用不同存储单元,单向传递 地址传递:使用数组名或者指针作为函数参数,传递的是该数组的 ...

  4. C语言中函数指针和回调函数的详解

    函数指针:指向函数的指针变量. 因此"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译 ...

  5. 在c语言中 函数的作用是什么,C语言程序中函数的定义

    C语言程序中函数的定义 C语言的函数问题是困扰很多学者的问题的,c程序中什么是函数呢?下面啦小编为大家精心推荐的c程序中函数的定义,希望能够对您有所帮助. C语言读书笔记--函数 先来看看函数的一般形 ...

  6. c语言中转向的指针,C语言指针碎碎念

    一个变量的地址称为该变量的指针. 一个变量专门用来存放另一个变量的地址(即指针),则称这个变量为指针变量. 指针和指针变量是两个截然不同的概念. int i = 3 :而且 i 被存储在内容的 200 ...

  7. c语言中函数的介绍(血书20000字!!!!)

    文章目录 函数 一:函数是什么? 二:C语言中函数的分类 1:库函数 (1):库函数存在的意义: (2):库函数的学习与使用 2:自定义函数 (1):自定义函数的组成 (2):例题 例题一:写一个函数 ...

  8. c语言中函数参数处理顺序以及默认参数原则

    c语言中函数参数处理顺序 下面我们来看2个案例,分析下c语言中函数参数处理顺序. 第一个: #include "stdio.h"void fn(int a,int b,int c) ...

  9. C语言 子函数改变指针指向的值

    C语言 子函数改变指针指向的值 首先,为了防止出错,我还在在<C primer plus>中再看了一次概念. 如下: 指针是个左值,就跟我们定义一个 int a = 10;一样. 接着再查 ...

最新文章

  1. 原生js实现点击按钮切换全屏!
  2. pandas使用pct_change计算数据列的百分比变化、环比变化率:计算当前元素和前一个元素之间的百分比变化、使用style函数指定format的格式:百分比、缺失值替换、用颜色标注极大值和极小值
  3. 下一次工业革命:计算生物学与生物平台
  4. 认知空间是什么意思_百变立体空间 搭建创意世界
  5. dataguard从库数据库丢失恢复例子(模拟所有的控制文件)
  6. Android 更改签名
  7. linux 下nginx应用场景的tcp内核调优
  8. HDU2527 Safe Or Unsafe【哈夫曼编码】
  9. 机器学习(6)——朴素贝叶斯(文本分类)
  10. 【综述】跨语言自然语言处理笔记
  11. JDBC — JDBC之Insert方法
  12. 虚拟主机网站搬到服务器上,如何把网页文件放到云虚拟主机
  13. 中文版通用工程师软件DPS 别克雪佛兰编程改装
  14. MongoDB可视化工具mongochef
  15. [混迹IT职场系列]一、转正的那些事儿
  16. while 循环导致 IndentationError: unexpected unindent错误
  17. MySQL技巧-EXPLAIN输出格式
  18. 听说,年终总结写不好,绩效要被打 C
  19. 【生活中的逻辑谬误】以泪掩过和以笑饰非
  20. AWS DynamoDB 常用操作

热门文章

  1. 如何在2021年选择一款Linux优雅的入门和爽快的使用呢???
  2. Excel转换成PDF后页数变多,教你3招完美转换
  3. GRE作文技巧:引用名人名言
  4. Web实时消息后台服务器推送技术GoEasy(支持多语言)---附GoEasy web 推送实例
  5. DataGrip连接hive报错:[ 08S01] Could not open client transport with JDBC Uri: jdbc:hive2://hadoop102:1000
  6. HTML期末作业-个人简历
  7. python大型游戏脚本_论做游戏脚本,Python输过谁?
  8. CSS+HTML 小米商品展示代码
  9. android 微博发布,手机上怎么用微博?手机如何发广播?
  10. 福州24小时图文打印店在哪里?