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.不能对地址进行算术操作
故,指针是由地址和类型两部分构成的
指向数据的指针不仅记录该数据的在内存中的存放的地址,还记录该数据的类型,即在内存中占用几个字节,这是地址所不具有的。
指向函数的指针不仅记录函数的入口地址,也记录该函数的类型,即函数的返回值类型和该函数的参数类型。
- C语言提高-第6讲: 参数传递方式(传值与传地址)
- 第4周 C语言及程序设计提高例程-6 参数传递方式:传值与传地址
- C语言及程序设计提高例程-6 参数传递方式:传值与传地址
- 《C语言及程序设计》程序阅读——参数传递方式:传值与传地址
- C语言参数传递----值传递与地址传递
- C语言函数参数传值方式传递
- C语言地址传递与值传递
- C语言值传递与地址传递
- 第二周项目1 C/C++语言中函数参数传递的三种方式--传地址方式
- C/C++中参数传递有两种方式,传值或传地址(传引用)
- c语言参数传递方式
- C语言提高-第5讲: 函数的参数(求4数最大公约数)
- C语言提高-第5讲: 函数的参数(回文、素数)
- C语言函数值传递与地址传递理解
- 漫谈C指针第十讲---参数的地址传递
- 第二周项目1 C/C++语言中函数参数传递的三种方式--传值方式
- 参数的传值方式与传地址方式
- C语言的参数传递方式
- 用Spring事物模板手动回滚
- 项目中定时器的使用
- Java笔记---部署 JavaWeb 项目到云服务器
- 线性表顺序表相关习题及详解 ——数据结构
- 以后再改
- C语言提高-第6讲: 参数传递方式(传值与传地址)
- 欢迎使用CSDN-markdown编辑器
- markdown使用
- Gentelella Master 前端框架 (TP5+MySql)
- 一个程序员6年的浏览器收藏夹
- docker学习笔记
- 关于logback.xml加载外部配置文件问题
- 喜欢的个性签名
- iOS 字符串的常用处理方法