C语言提高-第6讲: 参数传递方式(传值与传地址)

来源:互联网 发布:实现网络阅卷的学校 编辑:程序博客网 时间:2024/06/13 22:55

任务和代码:

 /* *All rights reserved *文件名称:main.c *作者: Osseyda 完成日期:2017.10.11 *版本号:v2. * *问题描述:认真分析下面的代码,掌握函数参数传递中           指针,地址,值的变化规律*/       #include<stdio.h>    void fun(int *a, int *b, int *c)    {        int temp;        temp=a;        a=b;        b=temp;        *temp=*b;        *b=*c;        *c=*temp;    }    int main()    {        int a,b,c,*p1,*p2,*p3;        a=5;        b=7;        c=3;        p1=&a;        p2=&b;        p3=&c;        fun(p1,p2,p3);        printf("%d,%d,%d\n",a,b,c);        return 0;    }

运行结果:


分析过程:

        p1=&a; 指针p1指向a=5这个值的地址   经过函数fun(p1,p2,p3)的内部运算,得到变量a,b,c的值

        函数的参数传递是按址传递的,地址里面的值发生变化才能传递到主函数中

        子函数 fun()经过第一次交换,使得值为a的地址a变成了地址b,值为b的地址b变成了地址a       

#include<stdio.h>    void fun(int *a, int *b, int *c)    {        int temp;        temp=a;        a=b;        b=temp;    }    int main()    {        int a,b,c,*p1,*p2,*p3;        a=5;        b=7;        c=3;        p1=&a;        p2=&b;        p3=&c;        fun(p1,p2,p3);        printf("%d,%d,%d\n",a,b,c);        return 0;    }

         可见,子函数中地址的交换不能改变主函数中对应的地址值

         由于b=temp;即b与temp代表了同一个地址,同一个地址里面的值当然一样,故*temp=*b;多余

         *b=*c;是一条赋值语句,即将地址c中的值赋值给地址b

         而地址c中的值就是p3指向的值c(3),由于值为b的地址b变成了地址a

         故地址a也即p1指向的变量a=3

         *c=*temp;也即*b=*temp;故也是多余的

#include<stdio.h>    void fun(int *a, int *b, int *c)    {        int temp;        temp=a;        a=b;        b=temp;        //*temp=*b;        *b=*c;        //*c=*temp;    }    int main()    {        int a,b,c,*p1,*p2,*p3;        a=5;        b=7;        c=3;        p1=&a;        p2=&b;        p3=&c;        fun(p1,p2,p3);        printf("%d,%d,%d\n",a,b,c);        return 0;    }

         

          综上所述:通过交换地址a和地址b,单纯交换地址不能改变主函数中变量的值,

                           再将变量c的值赋值给变量a,此时变量a的地址是地址b。

                          (即函数传参是按址传递并通过改变所指向地址中的变量值进行的)



据此,可以很好理解下一题:

    #include<stdio.h>      void exchange(int *,int *,int *);      void myswap(int *,int *);      int main( )      {          int a,b,c;          scanf("%d %d %d", &a, &b, &c);          exchange(&a,&b,&c);   //另一种调用方法          printf("%d %d %d\n", a, b, c);          return 0;      }      void exchange(int *q1,int *q2,int *q3)      {          if(*q1<*q2) myswap(q1,q2);          if(*q1<*q3) myswap(q1,q3);          if(*q2<*q3) myswap(q2,q3);      }      void myswap(int *pt1, int *pt2)      {          int temp;          temp=*pt1;          *pt1=*pt2;          *pt2=temp;      }  


拓展:指针和地址的区别

指针:(函数指针和数据指针)
1.指针有类型
2.可以进行算术操作

地址:
1.地址没有类型
2.不能对地址进行算术操作

故,指针是由地址和类型两部分构成的
      指向数据的指针不仅记录该数据的在内存中的存放的地址,还记录该数据的类型,即在内存中占用几个字节,这是地址所不具有的。
      指向函数的指针不仅记录函数的入口地址,也记录该函数的类型,即函数的返回值类型和该函数的参数类型。


阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摩托车大灯里面掉漆怎么办 行驶中轮胎爆胎怎么办 左拐车道直行了怎么办 踏板摩托车淋雨打不着火怎么办 购房小蓝本丢了怎么办 3d下载模型没颜色怎么办 车辆被扣30分怎么办 驾驶证被扣15分怎么办 驾驶本被扣分了怎么办 违章扣分扣错了怎么办 出国自驾游怎么办手续 新加坡开车工作遇到坏人怎么办 身份证户口本都丢了怎么办 户口本和身份证都丢了怎么办 网上预约挂完号没收到短信怎么办 驾驶证过了换证期限怎么办 身体弱末梢神经循环不好怎么办 自来水钙镁离子超标怎么办 呼吸感觉有煤烟味是怎么办 酒精弄到衣服上怎么办 孕妇吃了糟卤怎么办 气泡机打不了气怎么办 膝盖好冷好凉怎么办吃什么好 卸妆水进眼睛了怎么办 外出没带卸妆水怎么办? 种睫毛卸睫膏弄眼睛里面了 怎么办 化了妆没卸妆水怎么办 痘痘变成了黑痣怎么办 痘痘形成的痣怎么办 图片文件重命名改不了怎么办 想给宝宝改名字怎么办 洗照片像素过低怎么办 用ps改尺寸照片变形怎么办 平安银行卡三次密码错误怎么办 平安银行卡密码忘了怎么办 平安银行行用卡多次还款怎么办 平安银行大润发卡还不上怎么办 八载图片被投诉怎么办 ps用替换颜色后怎么办 三星s8百度闪退怎么办 吃了过敏的东西怎么办