创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)

函数参数传递的两种方式为值传递和引用传递

目录

函数参数传递的两种方式为值传递和引用传递

1.传值方式传参

2.引用方式传参

3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用

4.总结


1.传值方式传参

c语言是按值传递的,在函数中被传递的参数的本身(实参)是不能被修改的!参数x传进去的时候会被复制了一份copy,此后的修改都是在临时变量copy上,出了函数体copy被销毁,x还是原来的x,根本就没有被修改过,所以对变量x的修改无效。

如果想要修改传入的参数,有两种方法:

①传地址,传入x的地址,也就是将指向x的指针作为参数进行传递,【指针参数传递本质上是值传递,它所传递的是一个地址值】int f(int *x); f(&x); 指针传进去被复制了一份copy,x的指针的copy指向的内容也是x,对指针的copy的修改也就是修改了x的内容。 对于①来讲,在函数中如果传递的是指针,那么只能修改指针指向的内容,不能修改指针本身;如果想要修改指针本身,要么在再加一级指针,要么用引用&。

②引用传参 ,引用传参往往要比值传参高效,因为它是直接将x作为参数传入进去,而少了对x进行复制这部分的开销,既然传入进去的是x,那么对x的修改肯定也生效。

2.引用方式传参

引用可以被理解为变量的一个别名,但这依旧是原变量,如果在函数内对该变量进行修改的话,在外部该变量也会相应被修改。一定要先有原变量,才能有原变量的别名,故引用一定要赋初值,写成int &a=一个已存在的值的形式。

int a=11; int &b=a; b=9 在这时输出a的值发现a=9。 

【比如:我的名字叫王**,别名叫王哥,我在函数里传入的参数为王哥,在函数内部我修改了王哥的体重,那么在调用函数时,王**的体重也被修改了。】

引用声明后使用方式和原变量一样(用指针的话要加一个取值的操作)

3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用

①函数传递的是指针变量的值——即该指针所指向的变量的地址,只能改变指针所指向变量的值,而不能改变指针本身的值

错误例子
在函数中如果传递的是指针,那么只能修改指针指向的内容,
不能修改指针本身;如果想要修改指针本身,要么在再加一级指针,要么用引用&。
#include<cstdio>
#include<stdlib.h>
typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;
void CreateList(LNode *header){header=(LNode*)malloc(sizeof(LNode));header->data=11;header->next=NULL;
}
int main(){LinkList head=NULL;CreateList(head);if(head!=NULL){printf("%d\n",head->data);//什么都没有输出 }free(head);return 0;
} 
 //正确例子 (1)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;
LinkList CreateList(){LinkList header;header=(LinkList)malloc(sizeof(struct LNode));header->data=11;header->next=NULL;return header;
}
int main(){LinkList head = CreateList();if(head!=NULL){printf("%d\n",head->data);//什么都没有输出 }free(head);return 0;
}
//正确例子
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode* Linklist;
typedef struct LNode{int data;Linklist next;
}lnode;
void creatLNode( Linklist *P){*P = (Linklist)malloc(sizeof(struct LNode));(*P)->data = 11;(*P)->next = NULL;
}
int main(){Linklist P;creatLNode(&P);if(P){printf("%d ",P->data );}
} 

 

4.总结

其实指针类型和基本类型(比如int)来说,并没有本质上的差别。示例 :int x;LNode *L; (LNode为结构体)

在传值方式传参时,对于基本类型:函数参数为int x,调用函数传入x;对于指针:函数参数为LNode *,调用函数时传入L
在地址传递时,对于基本类型:函数参数为int *x,调用函数传入&x;对于指针:函数参数为LNode **,调用函数时传入&L。    
在引用方式传参,对于基本类型:函数参数为int  &x,调用函数传入x;对于指针:函数参数为LNode* &L(或LinkList &L ),调用函数时传入&L。   
当你传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值; 当你传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,即可以改变指针所指的内容,又可以改变指针本身

→补充注意点:

①在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。

②C语言中实参和形参之间的额数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不能。

③被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。

④”按值传递“中包括值传递和指针传递(指针传递参数本质上是值传递的方式,它所传递的是一个地址值),传递的都是实参的一个拷贝;虽然指针传递可以通过改变地址值来改变指针所指向的变量的值,但是不能改变指针本身的值。

⑤对于指针的引用类似于二级指针,但是也有一定的区别:无论你传值还是传指针,函数都会生成一个临时变量, 但传引用时,不会生成临时变量,不进行返回值copy等,速度快。

⑥关于引用传递和指针传递(本质是值【地址值】传递):

· 相同点:都是地址的概念

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

· 不同点: 

指针是一个实体(也可以理解为替身);引用只是一个别名(本体的另一个名字)
引用只能在定义时被初始化一次,之后不可改变;指针可以修改;
引用不能为空;指针可以为空;
sizeof 引用,得到的是所指向变量的大小;sizeof 指针,得到的是指针的大小;
指针 ++,意义为 指针的地址自增;引用++则是 所指变量自增;
引用是类型安全的,引用过程会进行类型检查;指针不会进行安全检查;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区域转换为二值图像_Matlab图像处理系列教程(一)

小编近期为大家带来一套全面系统的MATLAB在图像处理中的应用。灰度处理 灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R&#xff0c;G&#xff0c;B三个分量&#xff0c;分别显示出红绿蓝等各种颜色&#xff0c;灰度化就是使彩色的R&#xff0c;G&#xff0…

7.30 KubeCon2020 | 今天下午5:40 近几年最火爆的技术峰会之分享主题.NET开发者与Kuberentes...

01最负盛名的峰会自2018 年 KubeConCloudNativeCon 首次落地中国以来&#xff0c;CNCF 每年都会在中国举办云原生技术大会。大会每年都能吸引来自五大洲 48 个国家的开源精英和技术大咖前来参会。阿里、华为、腾讯等你所知道的每一家大厂都是KubeCon的大会赞助商。滑动查看更多…

[MyBatisPlus]测试BaseMapper的功能测试自定义功能

测试BaseMapper的功能 添加功能 /*** 实现新增用户信息*/Testpublic void testInsert(){User user new User();user.setName("张三");user.setAge(23);user.setEmail("zhangsanxx.com");int result userMapper.insert(user);System.out.println("r…

利用数组模拟队列和栈(详解)

利用数组模拟队列和栈 目录 利用数组模拟队列和栈 1&#xff1a;使用要领 2:具体代码 3&#xff1a;C栈和队列的链接 1&#xff1a;使用要领 在C语言中如果要用到了队列和栈 但又不想 写队列和栈的方法 &#xff0c;可已使用数组模拟队列和栈&#xff1b;但如果使用C便可以…

[MyBatisPlus]通用Service接口测试通用Service

通用Service接口 说明: 通用 Service CRUD 封装IService接口&#xff0c;进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆&#xff0c;泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能&#x…

windows 禁用ipv6服务_在 Windows 7 中禁用IPv6协议/IPv6隧道

How to disable certain Internet Protocol version 6 (IPv6) components in Windows Vista, Windows 7 and Windows Server 2008http://support.microsoft.com/kb/929852/HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\双击 DisabledComponents 来…

程序员修神之路--晦涩难懂的CAP,是否完全正确?

微信搜一搜架构师修行之路菜菜哥&#xff0c;帮忙解决一个问题是不是面试又被虐了&#xff1f;是的呢&#xff0c;这次面试官问我什么是CAP&#xff1f;这个可就说来话长了......01PARTCAP说到CAP&#xff0c;首先不能不说分布式系统&#xff0c;前面几篇也说过&#xff0c;分布…

7-4 是否同一棵二叉搜索树 (25 分)

是否同一棵二叉搜索树 1.题目描述&#xff1a; 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而&#xff0c;一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树&#xff0c;都得到一样的结果。于是对…

[MyBatisPlus]雪花算法

雪花算法 背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括&#xff1a;业务分库、主从复制&#xff0c;数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器&#xff0c;能够支撑…

pip 设置超时时间_Python pip使用超时问题解决方案

引言之前有位群友在群里发了个问题&#xff0c;说使用pip安装第三方包遇到"Read timeout"。我相信很多时候&#xff0c;大家在使用pip都会遇到这个问题&#xff0c;所以&#xff0c;我想有必要写一遍文章来总结一下。具体如下&#xff1a;解决方案在这之前&#xff0…

如何隐藏运行 winform 程序?

群里有个同学问了问题 如何隐藏运行 winform 程序&#xff1f;&#xff0c;提起了我的兴趣&#xff0c;玩玩呗&#xff1f;那就玩玩吧&#xff01;第一版 将一个 winform 程序隐藏执行&#xff0c;隐藏执行的方式有很多种&#xff0c;第一个 demo 就用最简单的方式&#xff0c;…

vector的基本用法 (详解 + 代码演示)

前言&#xff1a; vector 是向量类型&#xff0c;它可以容纳许多类型的数据&#xff0c;如若干个整数&#xff0c;所以称其为容器。vector 是C STL的一个重要成员&#xff0c;使用它时需要包含头文件&#xff1a;#include; 一、vector 的初始化&#xff1a;可以有五种方式,举…

python定义一个_Python,包括定义一个类

我有一个我要解决的问题&#xff1a;编写一个包含以下内容的类contentResult的定义&#xff1a;•String类型的实例变量winner&#xff0c;初始化为空字符串。在•String类型的实例变量second_place&#xff0c;初始化为空字符串。在•字符串类型的第三位实例变量&#xff0c;初…

[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

常用注解 TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗&#xff1f; 我们可以通过配置文件来解决这个问题&#xff1a; TableId 将属性所对应的字段指定为主键 TableId的value属性 TableId的ty…

最小堆和最大堆的建立以及基本操作

前言&#xff1a; 堆的特性&#xff1a;用数组表示的完全二叉树。有序性&#xff1a;任一结点的关键字是其子树所有结点的最大值 (最小值) 堆的本质&#xff1a;就是一颗 完全二叉树 堆的数据存储&#xff1a; 用的是 数组 建堆时主要的操作&#xff1a;就是调整 对数组的元素…

[C#.NET 拾遗补漏]06:单例模式最佳实践

阅读本文大概需要 3 分钟。大家好&#xff0c;这是【C#.NET 拾遗补漏】专辑的第 06 篇文章。今天讲讲大家熟悉的单例模式。单例模式大概是所有设计模式中最简单的一种&#xff0c;如果在面试时被问及熟悉哪些设计模式&#xff0c;你可能第一个答的就是单例模式。单例模式的实现…

字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型

Python语言中最常用的组合数据类型有3大类&#xff0c; 分别是集合类型、序列类型和映射类型。集合类型是一个具体的数据类型名称&#xff0c;而序列类型和映射类型是一类数据类型的总称。集合类型是一个元素集合&#xff0c;元素之间无序&#xff0c;相同元素在 集合中唯一存在…

[MyBatisPlus]条件构造器wapper

wapper简介 QueryWrapper 组装查询条件 查询用户名包含a&#xff0c;年龄在20到30之间&#xff0c;邮箱信息不为null的用户信息 package com.xxxx.mybatisplus;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xxxx.mybatisplus.mapper.Use…

7-6 列出连通集 (25 分)(详解)

列出连通集 1&#xff1a;思路 &#xff1a; 利用了邻接矩阵储存数据并建图&#xff0c;然后就是 DFS遍历和BFS遍历 只不过是本题需要输出的是非连通图 连通分量 外加俩函数搞定2&#xff1a;上码 #include<bits/stdc.h> using namespace std;//一些量的定义 queue<…

推荐:适合小白入门的Asp.Net Core 开源学习手册

前言推荐一个入门级的.NET Core开源项目&#xff0c;非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址&#xff1a;https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…