值传递和(地址)引用传递

#include <iostream>
#include <string>
using namespace std;

//值传递:(传值调用)
//效果上:方法内的改变不会影响到方法外
//本质上:只改变了形参的值,并没有改变实参的值
//条件上:形参的类型为基本类型或者一般复杂类型
void swap(int num1,int num2)    //传值调用
{
    int temp;
    temp = num1;
    num1 = num2;
    num2 = temp;
    cout << "swap: " << num1 << " " << num2 << endl;
}

//引用传递:(地址传递)(传址调用)
//效果上:方法内的改变会影响到方法外
//本质上:通过形参指针去改变了实参的值
//条件上:形参为指针和数组和引用时一般都是引用传递,(特殊情况:当函数内只改变了指针的指向,而没有通过指针去修改实参值时,仍然是传值调用)
void swap_point(int *num1,int *num2)    //传址调用
{
    int temp;
    temp = *num1;
    *num1 = *num2;
    *num2 = temp;
    cout << "swap_point:" << *num1 << " " << *num2 << endl;
}

void swap_value(int *num1,int *num2)    //传值调用
{
    int *temp;
    temp = num1;
    num1 = num2;
    num2 = temp;
    cout << "swap_value :" << *num1 << " " << *num2 << endl;
}

void swap_two(int **num1,int **num2)    //传址调用
{
    int *temp = NULL;
    temp = *num1;
    *num1 = *num2;
    *num2 = temp;
    cout << "swap_two: " << **num1 << " " << **num2 << endl;
}

void swap_ref(int &num1,int &num2)      //传址调用
{
    int temp;
    temp = num1;
    num1 = num2;
    num2 = temp;
    cout << "swap_ref " << num1 << " " << num2 << endl;
}

int main()
{
    int a = 10,b = 20;
    cout << "a = " << a << "b = " << b << endl;
#if 0
    swap(a,b);
#endif

#if 0
    swap_point(&a,&b);
#endif

#if 0
    swap_value(&a,&b);
#endif

#if 0
    int *p1 = &a,*p2 = &b;
    cout << *p1 << " " << *p2 << endl;
    swap_two(&p1,&p2);
    cout << "a = " << *p1 << "b = " << *p2 << endl;
#endif

    swap_ref(a,b);
    cout << a << " " << b << endl;
}
时间: 2024-10-12 20:33:28

值传递和(地址)引用传递的相关文章

Java 为值传递而不是引用传递

——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易混淆,特此总结一下 一.值传递和引用传递 首先这里我们先看下两者的异同: 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中

&quot;java语言中只有值传递,没有引用传递&quot;的理解

创建一个类Human public class Human { private int age; private int sex;//0-女,1-男 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } } 测试类 c

【Java基础】11、java方法中只有值传递,没有引用传递

转自:http://www.cnblogs.com/linkstar/p/5951141.htmlpublic class Example { String testString = new String("good"); char[] testCharArray = {'a','b','c'}; public static void main(String[] args){ Example ex = new Example(); ex.change(ex.testString,ex.

java方法中只有值传递,没有引用传递

public class Example { String testString = new String("good"); char[] testCharArray = {'a','b','c'}; public static void main(String[] args){ Example ex = new Example(); ex.change(ex.testString,ex.testCharArray); System.out.println(ex.testString)

C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在一个同名的局部变量,不管他们的类型是否相同,都是不允许出现同名的. 看下面的代码示例: 1 //这其中的strName就是一个形参也是一个变量,不允许出现同名的局部变量 2 public void SayHelloTo(string strName) 3 { 4 Console.WriteLine(

值传递 引用传递

方法参数传递有2种方式: 值传递和引用传递. 值传递: 默认都是值传递.值传递有2种,值类型和引用类型的.实质是复制栈中的值. 值类型的值传递:栈中的值就是实际值. 引用类型的值传递:栈中的值是内存堆中地址. 引用传递: 参数前加ref的为引用传递,引用传递有2种,值类型和引用类型的.实质就是传递自己本身,只是多了个别名.

值传递,指针传递;引用传递(c++独有)本质

要理解值传递.指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量.栈),内存的布局以及指针和引用的特点.这里主要总结三种参数传递方式使用的主要场合. 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递. 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销.如果需要改变指针本身,可以使用二重指针或者指针引用. 引用传递:除了提供输入值外,还返回操作结果,无需复制开销. #include<stdlib.h> //值传递,函数体内变量n是参数

C++中的值传递 指针传递 和 引用传递

C++中参数传递有三种:传递参数值.传递参数地址.传递参数的引用. 一.概念分解 1. 值 2. 指针 指针从本质上讲 就是存放 变量地址的 一个变量, 在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向地址中所存放的数据的改变. 3. 引用 引用是一个别名,在逻辑上不独立,它的存在具有依附性,所以引用必须在一开始就被初始化,而且在其生命周期中是不能改变的其引用的对象(即不能重新赋值,自始至 至终都只能依附于同一个变量) 二.概念详解 1. 值传递: 形参是实参的拷贝,改变形参的值

Java技术_Java千百问(0039)_引用传递和值传递有什么区别

点击进入_更多_Java千百问 1.什么是值传递 值传递,是将内存空间中某个存储单元中存放的值,传送给另一个存储单元.(java中的存储单元并不是物理内存的地址,但具有相关性) 例如: //定义了一个改变参数值的函数 public static void changeValue(int x) { ??x = x *2; } public class TestMain{ //调用该函数 int num = 5; System.out.println(num); changeValue(num);

【转载】C++ 值传递、指针传递、引用传递详解

原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递. 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作 引用传递: 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数