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=6
swap_by_ptr(&a, &b);//传地址
printf("a=%d, b=%d\n", a, b);//a=6,b=5
return 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);//abcd
puts(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=5
  return 0;
}

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

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

 2015-03-14 10:44:10

C/C++中传值和传地址(引用)的更多相关文章

  1. python中传值和传地址问题

    在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...

  2. c语言 参数传值和传地址

    static void TestCharP(char **p) { char *q = "ssssss"; *p=q; } static void TestCharP1(char ...

  3. Java中传值与传引用

    不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...

  4. php传值,传地址,传引用的区别

    传值,   是把实参的值赋值给行参   那么对行参的修改,不会影响实参的值 传地址   是传值的一种特殊方式,只是他传递的是地址,不是普通的如int   那么传地址以后,实参和行参都指向同一个对象 传 ...

  5. java中函数传值和传地址的问题

    记录一下这个难过的双休,2019.3.16-2019.3.17,16号上午字节跳动笔试,四道题只做出1道半,输入输出搞的半死,第三题类似于leetcode上的分糖问题,数组初始化的时候全部赋为0了,要 ...

  6. JAVA的String的传值和传地址问题

    关于Java的String类型,可能你会碰到这种情况,将String类型的变量传到一个函数,在这个函数中修改变量的值,但是,实参的值并没有发生改变. Java中String的传值/传地址问题: 例子引 ...

  7. 一段代码让你秒懂java方法究竟是传值还是传地址

    先看看代码以及执行结果: 凝视写得非常清楚了.我就不多说了. 我说说我的结论.事实上在java中没有传值还是传址的概念,java仅仅有引用的概念.引用类似传址.只是是一个变量名中保存着对象的地址,地址 ...

  8. C语言:传值,传地址

    形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...

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

    值传递:   函数范围内对值的任何改变在函数外部都会被忽略; 引用传递: 函数范围内对值的任何改变在函数外部也能反映出这些修改: 优缺点:按值传递时,php必须复制值.特别是对于大型的字符串和对象来说 ...

随机推荐

  1. JS内存管理与垃圾回收

    内存分配 var n = 374; // 为数字分配内存 var s = 'sessionstack'; // 为字符串分配内存 var o = { a: 1, b: null }; // 为对象及其 ...

  2. 洛谷——P2384 最短路

    P2384 最短路 题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你10000000000000000000000000000000 ...

  3. RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡

    RabbitMQ 默认的集群模式,也就是普通模式,最大的问题就在于存储队列完整数据的节点一旦宕机, 如果是非持久化队列,则消息丢失;如果是持久化队列+持久化消息,则必须等该节点恢复. 所以后来 Rab ...

  4. 【SAM】codevs3160-最长公共子串

    [题目大意] 求两个字符串的最长公共子串. [思路] 对第一个字符串建立后缀自动机,第二个字符串去匹配.cnt记录当前最长公共子串的长度,而ret记录答案. p代表位置指针,初始在rt位置. 对于第二 ...

  5. 搭建vsftpd

    安装完软件以后 1.建立用户 adduser ftp passwd 密码 2.修改vsftp.conf文件 anonymous_enable改为NO,阻止匿名上传 Anon_mkdir_write_e ...

  6. Problem F: 尖兵

    #include<stdio.h> struct man{ ]; int grade; }; int main(void) { int t; int i,j,n; ],max; scanf ...

  7. jquery ajax 的封装

    var tooAjaxData = new Object(); tooAjaxData = function () { this.AjaxUrl =" ";}; bookInfoC ...

  8. Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表

    A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...

  9. #iOS问题记录# UITextview富文本链接,禁止长按事件

    UITextView的富文本组装,添加图片点击事件,启动 - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *) ...

  10. VC知识库

    VC知识库http://www.vckbase.com/index.php/code