C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如:

void swap_by_value(int a, int b)
{int temp;temp = a;a = b;b = temp;
}
void swap_by_ptr(int* pa, int* pb)
{int temp;temp = *pa;*pa = *pb;*pb = temp;
}
int main(int argc, char* argv[])
{int a=5, b=6;swap_by_value(a, b);//传值printf("a=%d, b=%d\n", a, b);//a=5,b=6swap_by_ptr(&a, &b);//传地址printf("a=%d, b=%d\n", a, b);//a=6,b=5return 0;
}

  很显然,通过传值调用并不能改变main函数中的a与b,要想改变a与b的值就必须通过传地址方式,然后在被调用函数中通过指针访问到主函数中的变量。

  可是通过传递变量指针就一定是传地址调用么?看下面一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void get_str(char* p);int main(int argc, char* argv[])
{char* p = NULL;get_str(p);//传递指针printf("p=%p\n", p);puts(p);return 0;
}
void get_str(char* p)
{p = (char*)malloc(sizeof("abcd"));printf("%d\n", sizeof("abcd"));strcpy(p, "abcd");return;
}

  其中参数p是一个指针,程序想通过p来得到在get_str(char* p)中分配的一块内存。但是上面的代码并不能完成此功能。原因是程序需要在get_str(char* p)中修改main函数中的指针变量p,使其指向malloc返回的一块内存,要想在 get_str(char* p)中修改main函数中p的值就只有把p的地址传过去,在get_str中通过地址访问主函数中的变量p。正确的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void get_str(char** p);int main(int argc, char* argv[])
{char* p = NULL;get_str(&p);//传递地址(引用)printf("p=%p\n", p);//abcdputs(p);return 0;
}
void get_str(char** p)
{*p = (char*)malloc(sizeof("abcd"));printf("%d\n", sizeof("abcd"));strcpy(*p, "abcd");return;
}

  引用是C++中的语法,结合了传地址和传值的优点,即传递的是一个地址,但在形式上又没有指针那个怪异的符合*,看上去舒服多了。

下面是一个传引用版的swap()函数

void swap_by_ref(int& a, int& b)
{int temp;temp = a;a = b;b = temp;
}
int main(int argc, char* argv[])
{int a=5, b=6;swap_by_ref(a, b);printf("a=%d,b=%d \n",a,b);//a=6,b=5return 0;
}

  总之,如果想在被调用函数中改变哪个变量的值就需要把那个变量的地址传给被调用函数,这样在被调用函数中通过地址就可以访问和修改这个变量。传值的时候会对参数进行拷贝,然后传给被调用函数,而传地址只是对地址进行一份拷贝,然后赋给形参,这样在C++中如果传递一个比较大的对象时效率就有所区别了。对于简单类型的变量来说传值和传地址在根本上是没有区别的,都是传递一个数给被调用函数,而怎样去解释和使用这个数是我们事先约定好的。

转自:http://blog.chinaunix.net/uid-21411227-id-1826826.html

2015-03-14 10:44:10

C/C++中传值和传地址(引用)相关推荐

  1. Java中传值与传地址

    为什么80%的码农都做不了架构师?>>>    基本类型都是传值,传入的参数的改变不会影响原来的变量值. String类型也是传值,不会改变. 对象作为参数进行传递时,是把对象在内存 ...

  2. C++中的参数传递方式:传值、传地址、传引用总结

    指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元. 引用:引用和原变量是同一个东西,只不过是原变量的一个别名. int a = 10; 定义一个整型变量aint *p = ...

  3. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

  4. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

  5. 简单区别形参与实参,传值与传地址

    简单区别形参与实参,传值.传地址与传引用 函数的参数分为两种,分别是实际参数(实参)和形式参数(形参) 实际参数: 真实传给函数的参数,叫实参.实参可以是:常量.变量.表达式.函数等.无论实参是何种类 ...

  6. 传值、传地址、传名的区别

    传值.传地址.传名的区别 例题: (1)引用调用(call-by-reference) 传入的是B[1]的地址,也就是说x的改变会影响B[1]. I=1; x=x+2;//x为B[1],B[1]为3. ...

  7. php中什么时候用传值,php中传值与传引用的区别。什么时候传值什么时候传引用?...

    java中的this与super的区别 java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Ba ...

  8. vue中传值和传引用_vue prop属性传值与传引用示例

    vue prop属性传值与传引用示例 vue组件在prop里根据type决定传值还是传引用. 简要如下: 传值:String.Number.Boolean 传引用:Array.Object 若想将数组 ...

  9. C语言:函数中参数的传值与传地址

    任务代码: #include <stdio.h> void swap(int *a ,int *b)//按之前对指针认识,*a代表指针变量a,a存储的是地址,*a是地址的值. { //但是 ...

最新文章

  1. Java项目:网上商城系统(java+SSM+jsp+mysql+maven)
  2. 微信小程序导航栏设置透明
  3. 论记笔记的重要性:以三个电影为例
  4. MYSQL升级5.7.10后GROUP BY语句出错解决方法
  5. eclipse3.2配置开发C/C++
  6. fps测试网页_对话斗鱼云游戏负责人:做强网页端,近3成为新增用户
  7. python decorator_python 中的decorator
  8. 如何创建一份springboot的docker镜像
  9. C语言do while语句
  10. Access denied for user 'root'@'localhost' Could not obtain connection
  11. Python unittest基本框架组成(1)
  12. 003、使用MegaCli工具查看Raid磁盘阵列状态
  13. android ui设计灵感,26款高品质 APP UI原型设计灵感
  14. 【Front Plant Sci】LvMYB5 和 LvMYB1转录因子调控百合花青素合成
  15. JSP页面分页显示数据
  16. Python–cookbook–1.数据结构与算法
  17. 计算机相近专业职称,计算机专业技术职称有哪些?
  18. CryENGINE3初探Entities (二)----使用C++创建自定义Entity(一)
  19. python 將‘Sun May 01 21:48:58 2022‘格式的日期转为2022-05-01 21:48:58
  20. 体积小的台式计算机好吗,现在的台式电脑,已经变得这么小了吗

热门文章

  1. python读取文件报错必须有一个正确的读写方式_python文件操作
  2. vim调用python显示json数据
  3. 使用微型计算机的基础知识,计算机应用基础考试大纲基本要求1具有使用微型计算机的基础知识.DOC...
  4. java if and_关于java:if语句中可以有两个条件吗
  5. cd返回上一 git_PHP项目中应用CI/CD的碎碎恋!
  6. Python_基础_1
  7. 【自动驾驶】4.分布式实时通信——DDS技术
  8. 深度学习与计算机视觉系列(2)_图像分类与KNN
  9. 各种编程语言的深度学习库整理(中英版)
  10. Spring Validation(使用Hibernate Validator)