工控课堂

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

工控课堂 首页 工控文库 工控上位机 查看内容

函数参数的传值和传指针有什么区别?

2019-8-10 09:50| 发布者: gkket| 查看: 1| 评论: 0

摘要: 来源:公众号【编程珠玑】作者:守望先生前言我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。传值我们在初学C语言的时 ...

来源:公众号【编程珠玑】

作者:守望先生


前言

我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。

传值

我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和b的值的:

#include<stdio.h>
void swap(int a,int b)
{
    int temp = a;
    a = b;
    b = temp;
    printf("swap a = %d,b = %d\n",a,b);
}
int main(void)
{
    int a = 10;
    int b = 20;
    printf("before swap:a = %d,b = %d\n",a,b);
    swap(a,b);
    printf("after  swap:a = %d,b = %d\n",a,b);
    return 0;
}

运行结果如下:

before swap:a = 10,b = 20                                                                                                                                                                   
internal swap a = 20,b = 10                                                                                                                                                                 
after  swap:a = 10,b = 20 

可以看到,a和b的值最终并没有被交换。开始时a,b的值为10,20,而最终还是同样的值。

为什么呢?因为函数参数在传递的时候,都是传原数据的副本,也就是说,swap内部使用的a和b只是最初始a和b的一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始的a和b的值。

正因如此,我们常常被告知,不要把直接把结构体直接作为参数,这样效率会很低。由于结构体本身占用字节数较大,如果直接作为参数,那么将会产生一个较大的”副本“,如此一来,效率也就很低了。

我们再结合下面的图来理解:

t01b5e10eb3773b306f.jpg?size=408x468值传递

首先图中方框中的上部分a和b代表了main函数中的a和b,即原始数据,而方框中的下部分a和b代表了函数的参数a和b,即原始数据的“副本”。(后面的图都是如此,上部分代表原始值,下部分代表函数参数值)。

调用swap函数前后的情形如下:

t01a19cb5e81cc5d7f4.jpg?size=501x351调用swap前后

由于在swap中永远只是对a和b的副本进行操作,因此完全不影响原始的a和b的值。最终也不可能达到交换a和b的值的目的。

传指针

那么为解决上面的问题,我们知道,需要传指针。其代码如下:

#include<stdio.h>
void swap(int *a,int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
    printf("swap a = %d,b = %d\n",*a,*b);
}
int main(void)
{
    int a = 10;
    int b = 20;
    printf("before swap:a = %d,b = %d\n",a,b);
    swap(&a,&b);
    printf("after  swap:a = %d,b = %d\n",a,b);
    return 0;
}

运行结果:

before swap:a = 10,b = 20                                                                                                                                                                   
swap a = 20,b = 10                                                                                                                                                                          
after  swap:a = 20,b = 10 

可以看到在这种情况下,a,b的值才是真正交换了。

为什么又有传值,又有传指针


路过

雷人

握手

鲜花

鸡蛋

相关阅读

最新评论

热门文章

QQ|免责声明|本站介绍|工控课堂 ( 沪ICP备14007696号-3 )|网站地图

GMT+8, 2019-8-10 09:50 , Processed in 0.050552 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

返回顶部