函数参数的传值与传址

在如下的主函数里面调用swap函数,问哪一个才能正确交换a,b两变量的值?
int main()
{
    int a=3,b=5;
    int *pointer_1 = &a;
    int *pointer_2 = &b;
    swap(pointer_1,pointer_2);
    printf("%d %d",*pointer_1,*pointer_2);
    return 0;
}

/**
swap1是正确的,通过地址传递参数,令pointer_1和pointer_2两个指针变量所指向的变量的值发生了改变。
*/
swap1(int *p1,int *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

/**
swap2运行时,系统容易出问题。其实它在原理上是正确的,和swap1一样,但是*temp是指针变量temp所指向的变量(该变量应该是系统中

已经存在的了),但temp中并没有确定的地址值,它的值是不可预见的,故*temp所指向的单元也是不可预见的。因此,对*temp赋值可能会破

坏系统的正常工作状况。所以还是要像swap1一样,重新定义一个临时变量temp。
*/
swap2(int *p1,int *p2)
{
    int *temp;
    *temp = *p1;
    *p1 = *p2;
    *p2 = *temp;
}

/**
swap3视图通过改变形参的值来改变指针实参的值,犯了一个错误:C语言中实参变量和形参变量之间的数据传递是按单向的“值传递”方式
通过swap3方法,结果只是令形参p1指向了b,p2指向了a,但是原来的实参指向仍然没有变化。
*/
swap3(int *p1,int *p2)
{
    int *p;
    p  = p1;
    p1 = p2;
    p2 = p;
}

/**
swap4是初学者最易犯的错误,原因就是和swap3一样:只是形参的数据发生了改变,而实参并没有变化
*/
swap4(int x,int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

时间: 2024-08-08 22:06:10

函数参数的传值与传址的相关文章

Asp:函数是用传值还是传址

传址会把变量的内存地址传递到sub里,在sub里对变量所做的修改就是对原来的变量进行修改,而传值只是把变量的值传递到sub里,此时在sub里修改变量的值不会影响原来的变量. 在vb中调用函数默认是传址(byref),你可以在函数的参数前加byval使用传值方式. Private Sub test(a, ByRef b, ByVal c) a和b都是传址,c是传值 注:在asp中的函数里,默认是传址,如果需要传值,将变量前面加 ByVal 即可.

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

前言 我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了. 传值 我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和b的值的: #include<stdio.h> void swap(int a,int b) { int temp = a; a = b; b = temp; printf("swap a = %d,b = %d\n",a,b); } int main(void) {

类对象做函数参数(传值和传引用)

一.传引用 #include "stdafx.h" #include <iostream> using namespace std; class A { public: virtual void show(){cout<<"A"<<endl;} }; class B:public A { public: virtual void show(){cout<<"B"<<endl;} }; c

javascript的变量,传值和传址,参数之间关系

先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值. 书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样.基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制

php自定义函数的“传值”与“传址”学习笔记

参数的传递,可以分为 传值 和 传址 两种,究竟有什么区别呢? 1 2 3 4 5 6 7 8 9 10 function fun($num1,$num2) { $num1=100; $num2=1000; } $n1=1; $n2=10; fun($n1,$n2); echo “n1={$n1} n2={$n2}”; ?> 得到的结果是:n1=1 n2=10 这一段代码是传值的过程,自定义函数fun的参数传递具体$n1,$n2的值,这个很容易理解,我之前说的自定义函数都是传值,那什么是传址呢?

C# 函数的传值与传址(转)

http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { /* 先来了解一下什么是实参, 什么是形参. 所谓形参其实也就是说函数定义的时候所带的参数. 比如 static

Java传值和传址

调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下面这个例子可以实验一下: package test; import java.util.ArrayList; import java.util.List; public class ValueAndAddress { public static void f1(int x){ x = x + 5;

JS 基础知识2 传值和传址

要知道传址跟传址,首先我们先了解下数据值的操作. 1复制:可以把它赋值给一个新的变量 2传递:可以将他传递给一个函数或者方法 3比较:可以与另外一个值比较,判断是否相等 简要介绍下传值: 当一个数据是通过值被操作的,那么关系到的是数据的值,在赋值的过程中,是对实际值进行了COPY,储存在一个变量或者属性或数组中,copy的值与原数据是相互独立的. 当数据通过值传递给一个函数时,数据的一份传递给这个函数,如果函数体修改了这个值,只在函数体受影响,函数外的原数据不受影响. 当一个数据通过值和另外一个

javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay":value 对象字面2??定义方法和json很像,只有一点不同,json的key 必须加"" : 对象,数组也可以作为键值 JSON的组成 Javascript Object Notation 对象字面量的一种表现形式 : 键名必须有双引号""包围 : 为什么用J