关于指针的浅析---------指针的神奇之处(函数传递参数)

来源:互联网 发布:gta4优化补丁告别卡顿 编辑:程序博客网 时间:2024/06/05 20:46

关于指针的浅析,神奇的指针传递

往往在其他高级语言中,比如java,.net等中,我们的函数传递参数的时候,都是采用值传递的过程,专业术语叫做:值拷贝,我们传递的参数都不是原来的参数,而是一种拷贝过后的参数,并不会改变原来参数的数值 ,而是在内存的另外一个区域中,做了一个拷贝空间这样的动作,而我们在函数内部同样操作的也就是那一块拷贝过后的数值,但是C语言中的指针,却可以将一个数据的指向,传递进去,这样,我们就不必采用值拷贝的过程,同样,也减少了内存的开销,直接对原来的数据进行操作,大大的提高了函数效率

函数传递参数的方式

  1. 值传递
  2. 地址传递

值传递

值传递的过程是一种单向的,只能把实参的值单向的传递给形参,传递给形参,传递的过程中不好去影响实际参数
原理:
C语言执行函数的时候,会为每一个函数分配一定的栈空间,而函数中的局部变量都会放入到栈中去,等函数执行完了之后会去自动的释放栈中函数的资源;

地址传递

实参是一块内存中的地址,将这块地址传递给形式参数,函数中就可以通过传入的地址来操作这一块内存空间
注意:
形参指针 本身不会影响到实参指针本身的值的变化,但是通过形参指针可以修改实参数指针所指向的内存单元的数值。

下面我们通过可能算是最简单的例子来看一下数值传递与指针传递之间的区别:

#include<stdio.h>#include<stdlib.h>void swap1(int,int);void swap2(int*,int*);int main(int argc,char* argv[]){    int num1  = 10;     int num2  = 20;     swap1(num1,num2);    //num1与num2在经过swap1函数过后,回到主函数中,输出它的值    printf("main:num1:%d,num2:%d\n",num1,num2);    int num3  = 30;     int num4  = 40;     //传入地址前,输出原来主函数中的变量的数值    printf("main1:num3:%d,num4:%d\n",num3,num4);    swap2(&num3,&num4);    //输出函数执行完毕之后,回到主函数过后,原来变量的数值    printf("main2:num3:%d,num4:%d\n",num3,num4);    return 0;}void swap1(int num1,int num2){    int temp = 0;    temp = num1;    num1 = num2;    num2 = temp;    //输出交换过后的值    printf("swap1:num1:%d,num2:%d\n",num1,num2);}void swap2(int *num3,int * num4){    int temp = *num3;    *num3 =*num4;    *num4 =temp;    //输出交换过后的值    printf("swap2:num3:%d,num4:%d\n",*num3,*num4);}

输出结果为:
swap1:num1:20,num2:10
main:num1:10,num2:20
main1:num3:30,num4:40
swap2:num3:40,num4:30
main2:num3:40,num4:30

由上面的输出结果我们可以看出,swap1是值拷贝的过程,而swap2是函数穿参数的过程,值拷贝不会影响我们原来的参数,而函数传递参数后,在main函数中的变量的值也进行了改变

由此我们可以得出,形参如果是地址的话,我们可以直接去操作这一块内存空间,改变原来内存空间的数值,而值传递却不可以。

在C语言的实战过程中,地址传递无处不在

谢谢!!如有错误。请及时联系博主

0 0
原创粉丝点击