第一次写博客,可能有点乱,那么我们就从一个实例开始吧
目标:以一个简单的实例为例,编写一个函数实现交换两个变量的数值先看正确的方法,以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的数据,这样节省了很多内存。
第一次写博客,这也是自己在学习中的一些感悟,希望大家提出批评~~