传值与传址的区别与优缺点

第一次写博客,可能有点乱,那么我们就从一个实例开始吧

目标:以一个简单的实例为例,编写一个函数实现交换两个变量的数值先看正确的方法,以C语言为例

#include <stdio.h>

void f(int* x,int *y);

int main(void)

{ 

       int a=3,b=4; 

       f(&a,&b); 

        return 0;

}

void f(int * x,int *y)

  { 

           int temp;

            temp=*x; 

             *x=*y; 

              *y=temp;

 }

这样可以实现我们需要的功能,那么有很多同学在初学的时候可能会犯下面这种错误,当然我自己也曾经犯过

#include <stdio.h>

void f(int x,int y);

int main(void)

{

 int a=3,b=4; f(&a,&b); 

 return 0;

}

void f(int x,int y)

{ 

 int temp; 

 temp=x; 

 x=y; y=temp; 

 }

大家运行后发现a和b的值并没有互换,这是为什么呢? 主要是在f(int x,int y)函数中,变量x和变量y是独立存在的int类型变量,也就是说x和y是与a,b一样的在内存中被分配了内存的,当main函数调用f()函数的时候,我们只是将&x指向的内存中的数值换成了b,&y指向的内存当中的地址换成了a,并未对&a和&b内存当中的数值进行任何操作,也就是说你操作的是另外两个独立的与&a和&b没有关联的内存空间,所以自然无法交换a和b的值 。

那么第一种方法为什么可以呢?因为此时调用f()函数的时候,传入形参的是&a与&b,那么也就是说X=&a,y=&b,那么显然*x就和&a是一个概念了,操作*x和*y实际上就是对*(&a)与*(&b)进行操作,所以当调换*x与*y的值,实际上就是调换a和b的值了。 

 那么有的同学就会问传值与传址的优缺点在哪呢,很显然的,传值你需要分配额外的内存空间给你的形参,当你的形参占用的内存很大比如100个字节的时候,这样就很占内存了。于是传址的优势就体现出来了,大家知道windows32位下,地址总线是有32条的,也就是地址是4个字节32位数,所以无论你的形参是什么类型数据的地址,我传进去的只是数据的第一个字节的首地址,即4个byte的数据,这样节省了很多内存。

 第一次写博客,这也是自己在学习中的一些感悟,希望大家提出批评~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值