近期写二叉树的数据结构实验。想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下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语言中函数参数传递的本质是值传递

    数组名做函数参数进行传递时,实际上是是一份该指针的拷贝. 给形参赋予其他值,并不影响实参的值. 类似于: int *p = a;    //a为数组名 p = b;          //b为数组名 ...

  2. C语言——指向函数的指针

    转载自:http://www.cnblogs.com/liangyan19910818/archive/2011/08/19/2145270.html C语言——指向函数的指针 函数类型 (* 函数指 ...

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

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

  4. C语言中函数返回字符串的4中方法

    C语言中函数返回字符串的4中方法 函数的构成部分:返回类型.函数名称.参数.函数主体 参数:函数调用时传入的参数称为实参,函数定义时出现的参数为形参 形参的作用在于接收实参传入的值,形参和函数内部的其 ...

  5. C语言中函数的调用方式

    第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

  6. windev中的内存机制及其与C语言中的内存指针相似性(一)

    windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...

  7. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

  8. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  9. 指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为參数,泛型函数

     1.指针数组 数组里面的每一个元素都是指针. 指针数组的案比例如以下: 易犯错误: 2.数组指针 归根结底还是指针,仅仅是取*的时候可以取出一整个数组出来. 数组指针:(一个指针指向了数组.一般 ...

随机推荐

  1. 初见Python<2>:列表和元组

      1.在python中,最基本的数据结构是序列,序列中每一个元素被分配一个序号,即元素的位置,称为索引.索引从0开始,-1表示倒数第一个元素,-2表示倒数第二个元素,因此既可以是从前到后开始对元素进 ...

  2. luogu P1378 油滴扩展

    题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...

  3. 【manacher】HDU4513-吉哥系列故事——完美队形II

    [题目大意] 求最长回文队伍且队伍由中间向两边递减. [思路] 和字符串一样的做法,在递推的时候增加判断条件:a[i-p[i]]<=a[i-p[i]+2]. #include<iostre ...

  4. Activity(活动)生命周期--系统回收活动数据存储

    当一个活动进入停止状态的时候,是有可能被系统回收的.那如果处于停止状态的活动被系统回收了,而它上面却有我们所需要数据该如何保存呢?(类似于:打开qq进入下一个界面没有进去,返回的时候仍然不需要你输入账 ...

  5. PHP数组和数据结构(下)未完。。。。

    1.数组的遍历 (1)each(): 接受一个数组作为参数,返回数组中当前元素的键/值对,并向后移动数组指针到下一个元素的位置 键/值对被返回为带有四个元素的关联和索引混合的数组,键名分别为0,1,k ...

  6. PLM_百度百科

    PLM_百度百科 ZDLINK

  7. MFC绘制棋盘格

    (1)新建立一个MFC空白的基于视类的工程 (2)在View类中重写OnPaint消息 void CMy005View::OnPaint() { CPaintDC dc(this); // devic ...

  8. FIREMONEY手机虚拟键盘遮挡的解决

    FIREMONEY手机虚拟键盘遮挡的解决 尝遍了网上人们提供的N种方法之后,发现还是老猫的方法才是彻底解决问题的办法. 老猫“不看后悔XXX”--->RAD10.2.3 Flying Wang ...

  9. Java8新语言特性

    Java8简明指南 欢迎来到Java8简明指南.本教程将一步一步指导你通过所有新语言特性.由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解.本文的最后你会熟 ...

  10. this和$(this)的关系

    环境关键字this引用的是DOM元素 $(this)是jQuery对象 下面点击按钮分别alert一下 alert(this); alert($(this)); 获取DOM对象的属性id,可以 $(t ...