50分 C语言比较两个数的大小,调用这几种函数分别有什么不同,希望给详细解释一下
这三个函数实现的功能是交换两个数,但实际只有第一和第三种可以成功交换原来的传进来的实参,第二种交换的是形参的值,并不会改变实参的值
首先,要知道一点,函数调用的实质都是实参按值传递给形参,所以第一、二种函数接受的实参都是 int 类型两个数据,此处假设分别是 a 和 b ,而第三种函数接受的实参是一个 int 类型数据的地址,即为 &a 和 &b (此处的 & 表现为 “ 取地址符 ” ,在 C 语言中 & 具有多种功能,比如后面表现出来的 “ 引用符号” 的作用,这称作运算符的重载 )。
那么开始分析函数:
第一种,形参为 int & x 和 int & y(此处的 & 表现为 “ 引用符号 ” )
执行的操作为?
int?&?x?=?a?;int?&?y?=?b?;
其中 x 和 y 分别是 a 和 b 的引用, 如果我们把变量名理解为一段内存空间的标识符,那么引用可以理解对一段内存空间的另一个标识符,也就是说同一段内存空间可以用多个名字来标志。因为 x 和 a 表示的是同一内存空间的标识符,所以修改 x 所代表的内存空间的值就相当于修改 a 所代表的内存空间的值,y 与 b 的关系同理。
第二种,形参为?int x 和 int y
执行的操作为
int?x?=?a?;int?y?=?b?;
其中 x 和 y 都是局部变量,x 和 y 所代表的内存空间与 a 和 b 所代表的内存空间不同,这里把 a 和 b 所代表的内存空间的值通过赋值操作分别拷贝了一份,送给了 x 和 y所代表的内存空间,即 x 和 y 所代表的内存空间的值分别与 a 和 b 所代表的内存空间的值是相同的,但它们所代表的内存空间是不一样的,即内存空间的地址不同。所以交换 x 和 y 的内存空间的值并不会影响 a 和 b 的内存空间的值。
第三种,形参为?int * x 和 int * y
执行的操作为
int?*?x?=?&a?;int?*?y?=?&b?;
其中 x 和 y 分别是指向了 a 和 b 的内存空间的指针,x 和 y 也是局部变量,所以跟第二种函数一样,他们与 a 和 b 的内存空间也是不一样的,但是不同点在于,x 和 y 的内存空间里所存储的值是 a 和 b 的地址。所以通过 *x 和 *y 来访问 a 和 b 空间里值,这里的 * 表示是 “ 间接访问符 ”(与 & 一样,也是 * 的一种重载),它的功能是把 x 和 y 空间中的值(a 和 b 的内存空间的地址)当作地址找到 a 和 b 的内存空间,因此 *x 与 a 是等价的,*y 与 b 是等价的。所以交换 *x 和 *y 的值 就是交换 a 和 b 的值。
最后,总结一下,第一种引用交换和第三种指针交换的区别在于,指针需要另外开辟新的空间来储存地址,而引用并不需要额外的空间。
一次函数、二次函数、反比例函数、指数函数、幂函数、对数函数、三角函数、复合函数......
其实质是每一个x只有一个y与它对应,即一一映射......
但是一个y可能会有很多x与它对应......
所以例如圆就不是一个函数,因为它一个x有一个或两个的y对应......
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!