C/C++中传值和传地址(引用)
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
C/C++中传值和传地址(引用)的更多相关文章
- python中传值和传地址问题
在python中,还没有对这个知识点有一个详细的定义,很模糊的说明了,通过下面代码,可以观察出来,什么时候传的是值,什么时候传的是地址 有时候会发现自己的数据发生变化,可能就是这个原因,python的 ...
- c语言 参数传值和传地址
static void TestCharP(char **p) { char *q = "ssssss"; *p=q; } static void TestCharP1(char ...
- Java中传值与传引用
不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...
- php传值,传地址,传引用的区别
传值, 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传 ...
- java中函数传值和传地址的问题
记录一下这个难过的双休,2019.3.16-2019.3.17,16号上午字节跳动笔试,四道题只做出1道半,输入输出搞的半死,第三题类似于leetcode上的分糖问题,数组初始化的时候全部赋为0了,要 ...
- JAVA的String的传值和传地址问题
关于Java的String类型,可能你会碰到这种情况,将String类型的变量传到一个函数,在这个函数中修改变量的值,但是,实参的值并没有发生改变. Java中String的传值/传地址问题: 例子引 ...
- 一段代码让你秒懂java方法究竟是传值还是传地址
先看看代码以及执行结果: 凝视写得非常清楚了.我就不多说了. 我说说我的结论.事实上在java中没有传值还是传址的概念,java仅仅有引用的概念.引用类似传址.只是是一个变量名中保存着对象的地址,地址 ...
- C语言:传值,传地址
形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...
- php中传值与传引用的区别。什么时候传值什么时候传引用?
值传递: 函数范围内对值的任何改变在函数外部都会被忽略; 引用传递: 函数范围内对值的任何改变在函数外部也能反映出这些修改: 优缺点:按值传递时,php必须复制值.特别是对于大型的字符串和对象来说 ...
随机推荐
- HDU 1016.Prime Ring Problem-素数环,相邻两数和为素数-DFS
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- java Integer parseInt()
先来一段代码,代码很简单的,如下: public static void main(String[] args) { Integer a = Integer.parseInt("3" ...
- 01Trie【p4551(poj3764)】 最长异或路径
题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(T ...
- Loj#6432「PKUSC2018」真实排名(二分查找+组合数)
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...
- leetcode155 Min Stack
题意:模拟一个最小栈,可以push,pop,top,和返回栈中最小值. 思路:已经忘了栈是怎么构建的了,晕···尝试了半天,错误,发现直接用stack数据结构来做最方便,再用一个栈来存最小值.值得注意 ...
- 设计模式-命令模式(Command Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 命令模式简述 命令模式的主要作用是将“行为请求者”和“行为实现者”解耦.举个例子,假如我们现在要 ...
- uva 10648(简单dp)
Recently one of my friend Tarik became a member of the food committee of an ACM regional competition ...
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
题目描述 Welcome to SAO ( Strange and Abnormal Online).这是一个 VR MMORPG, 含有 n 个关卡.但是,挑战不同关卡的顺序是一个很大的问题. 有 ...
- BZOJ 3450 Tyvj1952 Easy(期望)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3450 [题目大意] 给出一个字符串,包含o,x和?,一个字符串的得分为 每段连续的o的 ...
- BZOJ 1257 [CQOI2007]余数之和sum(分块)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1257 [题目大意] 给出正整数n和k,计算j(n,k)=k mod 1 + k mod ...