一般来说c传值分为传值与传指针,Java里没有指针,因此只有传值,但是Java里传值分为简单变量传值和引用型变量传值,从本质上来说这两者没啥区别。

下面主要说的是传参时对原变量的影响:

最初练习创建单链表时可能会有这样一种写法:

void Creat_link_list(int n,struct node *head){

}

n是单链表节点的个数,head被初始化为null,调用该函数后可能会有人直接对head进行各种操作,比如遍历,排序。但此时head依然为null,函数内的一列操作只是head副本的操作,当函数调用结束后这个副本也就被系统释放了,对此这里一般有两种改法:

(1):

struct node *Creat_link_list(int n,struct node *head){
..........
..........
return head;
}

可以直接将函数里的head返回,这是一种非常重要的方法,特别是在递归代码中,这种写法很常见
(2):

void Creat_link_list(int n,struct node * &head){

}

采用引用传参,c++里采用的一种传参方式,形参与实参共用一个内存单元,对形参进行操作,实参自然也受到影响,一般来说这是一种很好也可以用来偷懒的方法(o(╯□╰)o)。

接下来大家可以看看严书里关于二叉排序树的删除操作:

特别是删除的关健操作:

void Delete(BiNode *&p){
if(p->rchild==NULL){
struct BiNode *q;
q=p;
p=p->lchild;
free(q);
}
else if(p->lchild==NULL)
{
struct BiNode *q;
q=p;
p=p->rchild;
free(q);
}
else{
struct BiNode *q,*s;
q=p;
s=p->lchild;
while(s->rchild){
q=s;
s=s->rchild;
}
p->data=s->data;
if(q!=p)
q->rchild=s->lchild;
else
q->lchild=s->lchild;
free(s);
}
}

删除核心代码:

   q=p;
p=p->rchild;
free(q);

这与平时对单链表的删除操作明显有区别,没有找到前驱节点,而直接将指向当前节点的指针指向下一个节点,这种写法一般来说是错误的,但因为这里采用的引用传参,保证了删除操作的正确性。

比如删除单链表中所有偶数节点的操作:

void Delete_even(struct node *&head){
struct node *q,*tmp;
tmp=head;
while(tmp->next){
if(tmp->next->res%2==0)
{
q=tmp->next;
tmp->next=q->next;
free(q);
}
else
tmp=tmp->next;
}
}

依然是先找先找前驱节点。

这里给出一种不找到前驱节点的方法,依然是采用引用传参和递归。

void DeleteNode(struct node* &p){
struct node *q;
q=p;
p=p->next;
free(q);
} void DeleteBFS(struct node * &p,int key){
if(p->data==key){
DeleteNode(p);
return ;
}
else
DeleteBFS(p->next,key);
}

总的来说,遇到指针时,一般来说需要考虑的问题就是改变指针的指向或者是改变指针所指向的内容(o(╯□╰)o)。

关于C中函数传参的一点理解的更多相关文章

  1. js中函数传参的情况

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. 验证python中函数传参是引用传递

    定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  3. [js]js中函数传参判断

    1,通过|| function fun(x,y){ x=x||0; y=y||1; alert(x+y); } fun(); 2.通过undefined对比 function fun(x,y){ if ...

  4. python中给函数传参是传值还是传引用

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  5. C语言 指针在函数传参中的使用

    int add(int a, int b)   //函数传参的时候使用了int整型数据,本身是数值类型.实际调用该函数时,实参将自己拷贝一份,并将拷贝传递给形参进行运算.实参自己实际是不参与运算的.所 ...

  6. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  7. C#篇(三)——函数传参之引用类型和值类型

    首先应该认清楚在C#中只有两种类型: 1.引用类型(任何称为"类"的类型) 2.值类型(结构或枚举) 先来认识一下引用类型和值类型的区别: 函数传参之引用类型: 1.先来一个简单的 ...

  8. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  9. [Java]_函数传参的疑惑与思考

    问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. void dfs(TreeNode node , int sum , ArrayList& ...

随机推荐

  1. netable 禁用拖动

    nestable在点击的时候,有一个拖动的状态被触发,会导致你给nestable上加的链接都会无效. 只要在最外层的li里加入一个class为:dd-nodrag,就不会被触发了.然后你在子菜单中就可 ...

  2. 初探Asp.net请求机制原理 1

    web原理 请求---响应 而一个 简单的请求 响应中包含太多知识,只有把 请求响应原理搞懂才能在web的世界里好好翱翔(注:自已的整理的知识参考博友们东西或自已所想,没有盗版权的意思,在此说明就不引 ...

  3. 关于qt QWebKit/QWebview 使用心得

    当前项目为c/s客户端,采用qt4.8.7,需要使用仪表盘.折线图.柱状图等,曾经使用过qwt和自定义的图形控件,但是都不尽如人意.最近发现ECharts控件不错.为此就要在qt端使用web的技术.为 ...

  4. Axiom3D:Ogre地形组件代码解析

    大致流程. 这里简单介绍下,Axiom中采用的Ogre的地形组件的一些概念与如何生成地形. 先说下大致流程,然后大家再往下看.(只说如何生成地形与LOD,除高度纹理图外别的纹理暂时不管.) 1.生成T ...

  5. java中String new和直接赋值的区别

        Java中String new和直接赋值的区别     对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才 ...

  6. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

  7. 简单入门dos程序

    --1.关机程序 注意:文件保存为.bat echo 晚安了,宝贝! @echo off shutdown -s -t exist --2.快捷/批量启动程序 title "程序系统启动&q ...

  8. 配置Tomcat监听80端口 配置Tomcat虚拟主机 Tomcat日志

    配置Tomcat监听80端口 • vim /usr/local/tomcat/conf/server.xml Connector port=" protocol="HTTP/1.1 ...

  9. Android(或者Java)通过HttpUrlConnection向SpringMVC请求数据(数据绑定)

    问题描写叙述 当我们使用SpringMVC作为服务端的框架时,有时不仅仅要应对web前端(jsp.javascript.Jquery等)的訪问请求,有时还可能须要响应Android和JavaSE(桌面 ...

  10. Peckham添加引用文件模糊匹配智能提示

    下载地址:https://github.com/markohlebar/Peckham ​ 跟VVDocumenter规范注释生成器的安装方式一样: 下载开源工程在Xcode重新编译运行会自动安装此插 ...