【转载】函数参数传递(值传递,指针传递)

C语言值传递 地址传递 :

1.值传递

eg:

1     void Exchg1(int x, int y)  
 2     {  
 3          int tmp;  
 4          tmp = x;  
 5          x = y;  
 6          y = tmp;  
 7          printf("x = %d, y = %d\n", x, y);  
 8     }  
 9     main()  
10     {  
11          int a = 4,b = 6;  
12          Exchg1(a, b);  
13          printf("a = %d, b = %d\n", a, b);  
14          return(0);  
15     }

本例中:

在调用Exchg1(a,b)时最开始做的两个隐含动作是:int x=a;int y=b;.及x=a;y=b;

原来函数在调用时是隐含地把参数a,b的值分别赋值给了x,y。之后在函数体内一直是对形参x,y进行操作。并没有对a,b进行任何操作。

函数只是把a,b的值通过赋值传递将值传递给了x,y。函数里操作的只是x,y的值,并不是a,b的值。这就是所谓的值传递

2.地址传递

eg:

1     void Exchg2(int *px, int *py)  
 2     {  
 3           int tmp = *px;  
 4           *px = *py;  
 5           *py = tmp;  
 6           printf("*px = %d, *py = %d.\n",*px, *py);  
 7     }  
 8     main()  
 9     {  
10           int a = 4,b = 6;  
11           Exchg2(&a, &b);  
12           printf("a = %d, b = %d.\n", a,b);  
13           return(0);  
14     }

本例中:

在调用Exchg2(&a,&b)时最开始做的两个隐含动作是:int *px=&a;int *py=&b;.及 px=&a;py=&b;.

原来函数在调用时是隐含地把参数a,b的地址分别传递给了指针px,py。之后在函数体内一直是对指针px,py进行操作。也就是对a,b的地址进行的操作。

(注:上述有说到,复制到tmp中,这种说法是不对的,tmp是一个变量。但不妨碍我们理解)

注意:c语言中不存在引用传递(C++中才存在),如下:

引用传递

eg:

1 void Exchg3(int &x, int &y)  
 2 {  
 3      int tmp = x;  
 4      x = y;  
 5      y = tmp;  
 6      printf("x= %d,y = %d\n", x, y);  
 7 }  
 8 main()  
 9 {  
10      int a = 4,b =6;  
11      Exchg3(a, b);  
12      printf("a= %d, b = %d\n", a, b);  
13      return(0);  
14 }

本例中:与值传递相比,代码上只有只有一处不同,即函数定义处:void Exchg3(int &x, int &y)

【转载】函数参数传递(值传递,指针传递)

时间: 2024-12-14 18:18:49

【转载】函数参数传递(值传递,指针传递)的相关文章

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

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

指针专题4-指针作为函数返回值(指针函数)

C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数strlong(),用来返回两个字符串中较长的一个. /* 返回两个字符串中最长的一个 */ char *strlong(char *str1, char *str2) { if(strlen(str1)>=strlen(str2)){ return str1; }else{ return str2; } } void main(){ char str1[30],str2[30],*str; gets

关于函数返回值为指针类型的分析

注意(原则):永远不要返回一个局部变量的指针或引用(其实是隐式的指针),可以返回局部变量本身,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存. 抓住这个原则,我们来看一下例子: 1.返回变量本身 //这个返回变量本身内存可以,正确 int add(int x, int y) { int sum = x + y; return sum; } int main() { int a = 3, b = 5; cout <<

函数返回值是指针

#include<stdio.h> #include<string.h> char *mystrchr(char *s,char c) { while(*s) { if(*s == c) { return s; } s++; } return NULL; } int main() { char str[100] = "hello world"; //char* s = strchr(str,'a'); char *s = mystrchr(str,'a'); p

JavaScript 函数参数传递到底是值传递还是引用传递

tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备.那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,基本类型的传递: function add(num){ num+=10; return num;

C++函数参数-值,指针,引用

本文转载自SurpassLi的博文:http://www.cnblogs.com/lidabo/archive/2012/05/30/2525837.html,修改了部分代码和贴图,如有侵犯版权请与我联系删除.           以“ 值传递”方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int or

c++函数参数类型-值,指针,引用

    以" 值传递"方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int originalValue,int newValue){     originalValue = newValue;   }      int main(){     int myNum=20;     changeV

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的参数.返回值,甚至函数的定义体. const 是constant 的缩写,"恒定不变"的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:"Use const whenever you need". 1

c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

概念 首先从概念上来说一下这几种函数传参方式及区别: 1.值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参数,返回值那是return考虑的: 2.指针传递:指针传递参数从本质上来说也是值传递,它传递的是一个地址.[值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数内的栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成了实参的一个副本(记住这个,函数内参数的是实参的副本)].由于指针传递的是外部