首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

参、指针参、引用参区别

在C中,我们只了解到有两种参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种参方式,那就是引用(type &),引用参给我们带来了更好体验。...那三者具体区别在哪里呢? 1、值传递 值传递是一种值拷贝操作,一般只用于传入参数使用,而且如果传入值体积过大(比如一个结构体),在函数压栈过程中会拷贝一份压入栈中,会影响效率。...而且在函数生命周期结束后,会随函数一起消失,如不作为返回值是无法传出。...并且在函数内部还可以通过指针修改指针指向地址数据以作为传出数据作用。 3、引用传递 引用作为一个变量别名,相当于一段内存引用。...在传递给函数时相当于包装了原变量指针地址递给函数,可以理解为在函数中直接使用原变量进行操作,而且这个期间不会出现拷贝行为。引用本质是指针,C++对裸露内存地址(指针)作了一次包装。

23140

c语言基础知识帮助理解(详解函数

函数参数 4.1实际参数(实参) 函数实际参数是在函数调用时传递给函数值。实际参数可以是常量、变量、表达式或其他函数返回值。实际参数值被传递给函数形式参数,从而在函数内部使用。...在main()函数中,我们声明了两个整数变量x和y,并将它们作为实际参数递给printSum()函数。在printSum()函数内部,形式参数a和b接收到相应值,并计算它们和。...最后,在函数中打印出结果 需要注意是:形参实例化之后其实相当于实参一份临时拷贝,想要改变参数值,单单传值操作是不行哦,我们要进行址操作(后面讲) 5.函数调用 5.1值调用 值调用是指在函数调用时...,将实际参数值复制给形式参数,二者地址是不同,即函数形参和实参分别占有不同内存块,对形参修改不会影响实参 5.2址调用 (传递地址址调用是把函数外部创建变量内存地址递给函数参数一种调用函数方式...在main()函数中,我们声明了两个整数变量x和y,并将它们作为实际参数递给add()函数。add()函数返回x + y结果,然后将这个结果作为实际参数递给multiply()函数

10810
您找到你想要的搜索结果了吗?
是的
没有找到

C语言函数参数是如何传递

因为函数参数在传递时候,都是原数据副本,也就是说,swap内部使用a和b只是最初始a和b一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始a和b值。...正因如此,我们常常被告知,不要把直接把结构体直接作为参数,这样效率会很低。由于结构体本身占用字节数较大,如果直接作为参数,那么将会产生一个较大”副本“,如此一来,效率也就很低了。...我们再通过图来理解前面为什么指针就可以交换a,b值: 指针 从图中可以看出,虽然传递给函数是指向a和b指针副本,但是它副本同样也是指向a和b,因此虽然不能改变指针指向,但是能改变参数a...我们还是利用前面所知来分析,由于传递给getMemory函数参数都是一个副本,因此函数p也是外部p一个副本,因此即便在函数内部,将p指向了一块新申请内存,仍然不会改变外面p值,即p还是指向NULL...我们需要传入p地址,即指向int类型指针指针。

4.1K11

函数参数值和指针有什么区别?

因为函数参数在传递时候,都是原数据副本,也就是说,swap内部使用a和b只是最初始a和b一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始a和b值。...正因如此,我们常常被告知,不要把直接把结构体直接作为参数,这样效率会很低。由于结构体本身占用字节数较大,如果直接作为参数,那么将会产生一个较大”副本“,如此一来,效率也就很低了。...我们还是利用前面所知来分析,由于传递给getMemory函数参数都是一个副本,因此函数p也是外部p一个副本,因此即便在函数内部,将p指向了一块新申请内存,仍然不会改变外面p值,即p还是指向NULL...我们需要传入p地址,即指向int类型指针指针。...getMemory 总结 本文总结如下: 函数参数都是原数据“副本”,因此在函数内无法改变原数据 函数参数都是值,指针本质上也是值 如果想要改变入参内容,则需要该入参地址(指针和引用都是类似的作用

3K30

C语言作业详解12_17(题型对应知识点)

四、有返回值函数使用 A、函数调用可以作为独立语句存在,这表示我们可以仅仅调用一个函数而不接收其返回值。...B、函数调用可以作为一个函数实参,这意味着我们可以将一个函数调用作为一个函数参数传递。 C、函数调用可以出现在表达式中,这意味着我们可以用函数调用返回值参与到表达式运算中。 D、错误。...函数调用虽然不能直接作为一个函数形参,但可以定义函数指针作为形参,然后将函数调用通过函数指针传递给该形参。 五、函数命名 A、错误。...void play(int a,b) — 这种写法参数列表缺少参数类型,应该为每个参数指定数据类型。 C、正确。 D、错误。不符合C语言语法规范 六、参方式 A....八、函数定义 A. int f(int x;int y) — 这个选项使用了分号 ; 而不是逗号 , 来分隔参数,这是语法错误 B、int f(int x, y) — 这个选项在函数定义中只给出了一个参数

9510

C语言中函数参数传递三种方式

C语言中函数参数传递三种方式 (1)值,就是把你变量值传递给函数形式参数,实际就是用变量值来新生成一个形式参数,因而在函数里对形参改变不会影响到函数变量值。...(2)址,就是变量地址赋给函数里形式参数指针,使指针指向真实变量地址,因为对指针所指地址内容改变能反映到函数外,也就是能改变函数变量值。...(3)引用,实际是通过指针来实现,能达到使用效果如址,可是使用方式如值。 说几点建议:如果值的话,会生成新对象,花费时间和空间,而在退出函数时候,又会销毁该对象,花费时间和空间。...自动把x,y地址作为参数递给swapint函数。...2、给函数传递大型对象 当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象 副本,也就是参数传递时,对象无须复制。

2.4K10

结构体作为函数参数

1.传递结构体成员 > 只要结构体成员是一个具有单个值数据类型,便可把它作为参数递给接受该特定类型函数。 > 使用这种方式为函数传递参数与普通变量作为参数相同,都是以方式传递。...运算符优先级很高,高于&取址运算符,但是仍然建议加上括号,是表达更加清晰。 2.传递结构体 > 使用结构体变量作为函数参数时,也是,会将结构体变量全部内存单元内容拷贝一份传递给被调函数。...(struct book stdata); modify(Shot); 3.传递结构体地址 > 在过程中,程序空间和时间开销比较大,且传递是一份拷贝,并不能改变实参本身值。...为了解决以上问题,使用结构体指针是一个更好办法。 > 需要注意是,结构体变量名与数组变量名不同,结构体变量名不是它地址。...modify中,要使用指向运算符->访问结构体成员或者使用括号,因为他参数一个结构体指针 > 实参还有第二种写法,将实参直接定义为结构体指针 struct book { float price

2.1K10

深入探索C语言中结构体:定义、特性与应用

函数类型:表示函数参数和返回值类型。 这些类型可以在结构体中作为成员类型,用于定义结构体成员变量。...->name, ps->age);//使用->访问ps指向结构体成员 结构体参 结构体参可以通过以下两种方式: 参 将结构体副本传递给函数。...); 地址参 将结构体指针传递给函数,以便在函数内部修改结构体内容。...(&s); 结构体时候,要结构体地址。...这是因为函数时候,参数是需要压栈。如果传递一个结构体对象时候,结构体过大,参数压栈系统开销比较大,所以会导致性能下降。此外,传递结构体地址也便于我们修改结构体内容。

7310

Java值调用

我们先来看看这些编程语言里关于参数传递函数调用有关术语。...尽管很多使用值调用编程语言(如Common Lisp、Eiffel、Java)从左至右求值函数实际参数,某些语言(比如OCaml)从右至左求值函数和它们实际参数,而另一些语言(比如Scheme...值调用:在值调用中,实际参数被求值后传递给被调函数。也就是说值调用是实参在被传给函数之前就被求值一种求值策略。 在Java中体现 那什么叫实参在被传给函数之前就被求值呢?求是谁值呢?...我们可以让u2指向另一个内存空间,即通过getNewUser()方法获取一个User对象,用这种方式给u2一个地址值,这不就改变了吗。...引用调用(Call by reference) 在“引用调用”求值中,传递给函数是它实际参数隐式引用而不是实参拷贝。通常函数能够修改这些参数(比如赋值),而且改变对于调用者是可见

3.5K20

【小白学习C++ 教程】六、C++内置函数函数

为了使用函数我们通常需要包含定义这些库函数头文件。 例如,为了使用sqrt()和等数学函数abs(),我们需要包含头文件cmath。...在这种情况下, return_type 是关键字void函数名称:这是函数实际名称。函数名和参数列表共同构成了函数签名。 参数参数就像占位符。当一个函数被调用时,你将一个值传递给参数。...void greet() { std::cout << "Hello World"; } 在上面的程序中,我们声明了一个名为greet(). 要使用函数greet(),我们需要调用它。...C++中函数参数传递方式有三种:值、地址引用。 这里先学习最简单值。在这种传递参数 中,我们传递存储或复制到函数形式参数参数值。因此,原始值不变,只是函数内部参数发生了变化。...void calc(int *p); int main() { int x = 10; calc(&x); // 传递x地址作为参数 printf("%d", x);

86230

【C语言】指针进阶之值调用与址调用

它们主要区别在于参数传递方式: ☞值调用:这是最基本参数传递方式,它涉及将参数值复制一份传递给函数。...在函数内部,对这些复制值进行任何修改都不会影响到原参数值,因为函数只是在自己局部范围内操作这个副本。 ☞址调用:这种方式则是将参数地址递给函数。...这样做目的是让函数能够直接访问到传入参数,并且可以对这些地址指向数据进行修改。...这种调⽤函数⽅式我们之前在函数时候就知道了,这种叫值调⽤。 结论:实参传递给形参时候,形参会单独创建⼀份临时空间来接收实参,对形参修改不影响实 参。 所以Swap是失败了。 那怎么办呢?...Swap2⽅式,顺利完成了任务,这⾥调⽤Swap2函数时候是将变量地址递给函数,这种函数调⽤⽅式叫:址调⽤。

11410

C++: 21---引用和指针

swap_int函数使用指针传递参数,可以实现对实参进行改变目的,是因为传递过来是实参地址,因此 使用*a实际上是取存储实参内存单元里数据,即是对实参进行改变,因此可以达到目的。...也就是说将指针作为参数进行传递时,事实上也是值传递,只不过传递地址。...当把指针作 为参数进行传递时,也是将实参一个拷贝传递给形参,即上面程序main函数p何test函数使用p不 是同一个变量,存储2个变量p单元也不相同(只是2个p指向同一个存储单元),那么在test...如果要想达到也同时修改目的的话,就得使用引用了。 (2)将引用作为函数参数进行传递。...假如是引用参,则不会调用自己拷贝构造函数。 2.如果作为函数参数,你不希望函数内修改它,那么你选择指针还是引用?

70820

C++从入门到精通——引用(&)

在main函数中,将变量x传递给increment函数后,x值被递增为11。因为参数是引用类型,所以对i修改会直接影响到x。...在函数定义时,使用常引用作为参数,可以防止函数参数进行修改。 需要注意是,引用作为函数参数时,函数内部对引用修改也会反映到函数外部变量上。...在main函数中,将变量x传递给print函数后,print函数无法修改x值。这样做可以确保函数不会意外地修改传递给参数。...五、值、引用效率比较 以值作为参数或者返回值类型,在参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用值作为参数或者返回值类型,效率是非常低下...我们来看下引用和指针汇编代码对比: 引用和指针不同点 引用概念上定义一个变量别名,指针存储一个变量地址

9210

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

-- 限定返回值 : 函数不接收参数, 使用 void 作为参数, 如果传入参数, 编译器就会报错; 使用void注意点 :  -- void不能表示变量 : void a, 这样定义是错误; --...因此这里我们统一规定, 如果函数没有参数, 就定义为void; . (2) void*简介 void * 作用 :  -- 通用数据类型 : void * 指针可以存放任意类型数据地址, 任何数据类型指针都可以赋值给...void * 通用类型指针; -- 任意类型 : 如果 函数 参数 和 返回值 可以是任意类型, 就可以使用 void * 作为函数 参数 或者 返回值; 使用void* 注意点 :  -- void...函数参数值调用和址调用 (1) 值调用 和 址调用 值调用 : 以方式将参数递给函数, 不能直接修改主函数中变量值, 仅仅是将副本传递给函数; 址调用 : 将 变量指针 传递给函数...; a = p 和 a++ 会报错; 数组参数 :  -- 形参指针 : 将数组作为参数递给函数时候, 传递是数组地址, 传递地址, 形参是指针; 数组参数示例 :  -- 函数参数是数组

3.9K20

java中参数传递-值传递、引用传递

Java 应用程序中变量可以为以下两种类型之一:引用类型或基本类型。当作为参数递给一个方法时,处理这两种类型方式是相同。两种类型都是按值传递;没有一种按引用传递。 按值传递和按引用传递。...按值传递意味着当将一个参数递给一个函数时,函数接收是原始值一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。...按引用传递意味着当将一个参数递给一个函数时,函数接收是原始值内存地址,而不是值副本。因此,如果函数修改了该参数,调用代码中原始值也随之改变。...1、对象是按引用传递 2、Java 应用程序有且仅有的一种参数传递机制,即按值传递 3、按值传递意味着当将一个参数递给一个函数时,函数接收是原始值一个副本 4、按引用传递意味着当将一个参数递给一个函数时...地址是什么,不过就是一个整数值)   再看看下面的例子:   class Test02   {   public static void main(String[] args)   {   int i=

4.7K20

【C++】This指针和复制构造函数

this指针是指向本类对象指针,它作为参数递给成员函数 this指针是隐式使用。由编译器自动实现,我们不必人为在形参中添加this指针。...CTime(CTime& time);//使用类名对象作为参数引用 调用复制构造函数时机: 在什么情况下使用复制构造函数 1.以其他对象作为参数创建新对象时。...比如:创建一个对象时候,把原来一个对象作为参数递给对象作为构造函数 CTime time; CTime time2(time);//会自动执行复制构造函数,复制成员等 CTime::...,以类对象(值)作为函数参数时, 这样在使用时候,就会造成死循环!...我们使用类对象作为函数参数时候,以及返回一个对象时候,代价是很大, 因为伴随着对象创建和销毁,还伴随着复制构造函数调用, 所以一般使用引用来规避这种代价!

81620

java面试题

Java编程语言只有值传递参数。 当一个对象实例作为一个参数被传递到方法中时,参数值就是该对象引用一个副本。...4.Java应用程序中变量可以为以下两种类型之一:引用类型或基本类型。当作为参数递给一个方法时,处理这两种类型方式是相同。两种类型都是按值传递,没有一种按引用传递。   ...按值传递意味着当将一个参数递给一个函数时,函数接收是原始值一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。   ...按引用传递意味着当将一个参数递给一个函数时,函数接收是原始值内存地址,而不是值副本。因此,如果函数修改了该参数值,调用代码中原始值也随之改变。...如果函数修改了该参数地址,调用代码中原始值不会改变。   值传递:方法调用时,实际参数把它值传递给对应形式参数,方法执行中,对形式参数改变不影响实际参数值。   引用传递:也称为地址

1.1K10

C语言详解(二) - 函数

函数种类 2.1 库函数 C语言中包含了许多种类函数,把一些实现特定功能代码(如:输入输出、字符串比较、数学中一些函数实现、申请内存等)封装成一个函数,方便我们使用。...3.2 声明 函数定义可以放在程序开头,但函数定义一般会跨越多行,当有多个函数被定义时main函数前面将会变得繁杂,不利于我们写程序。函数一般满足先声明后使用。...函数参数 4.1 实际参数(实参) 传递给函数具有确定参数称为实参。 实参可以是常量、变量、函数、表达式等。 4.2 形式参数(形参) 函数名后括号内定义各种变量。...函数调用 值调用 址调用 5.1 值调用 实参值传递给非指针形参,由于实参与形参具有不同储存空间,形参也不知道实参地址,所以形参无法通过实参地址影响实参值。...{ printf("%d ", arr[i]); } printf("\n"); } 运行结果: 5.5 链式访问(链式调用) 一个函数返回值作为这个函数或另一个函数参数

84910

【C语言基础】:深入理解指针(二)

函数x和y是一个独立空间,在Swap函数内部进行了交换,但却无法返回到main函数中,导致a和b没有实现交换,Swap1函数使用时候,是把变量本身直接传递给函数,这种调用函数方式我们之前在函数时候就知道了...那么就可以使用指针了,在main函数中将a和b地址递给Swap函数,Swap函数里边通过地址间接操作main函数a和b,并达到交换效果就好了。...递给函数,这种函数调用方式叫:址调用。...前面我们说到:数组名是数组首元素地址;那么在数组时候,传递是数组名,也就是说本质上数组参传递是数组首元素地址。 所以函数形参部分理论上应该使用指针变量来接收首元素地址。...那么在函数内部我们写sizeof(arr) 计算是⼀个地址大小(单位字节)而不是数组大小(单位字节)。正是因为函数参数部分是本质是指针,所以在函数内部是没办法求数组元素个数

9510

【C语言】深入解开指针(二)

assert()宏接受一个表达式作为参数。如果该表达式为真(返回值非零),assert()不会产生任何作用,程序继续运行。...在调⽤Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和 y 接收a和b值,但是x地址是0x008ffdc4,y地址是0x008ffdc8,x和y确实接收到了a和...Swap1函数在使⽤时候,是把变量本⾝直接传递给函数,这种调⽤函数⽅式我们之前在函数时候就知道了,这种叫值调⽤。...#include void Swap2(int *x, int* y)//使用指针接收a和b地址 { int temp = 0; temp = *x;//接引用操作符*x *y...b=%d\n", a, b); return 0; } 我们可以看到实现成Swap2⽅式,这⾥调⽤Swap2函数时候是将变量地址递给函数,这种函数调⽤⽅式叫:址调⽤ 结论: 址调用

10910
领券