关于网站建设的名言,织梦cms做电影网站,百度应用商店官网,专门做外贸的网站有哪些值传递 引用传递#xff08;传地址#xff0c;传引用#xff09;的区别
传值#xff0c;是把实参的值赋值给行参 #xff0c;那么对行参的修改#xff0c;不会影响实参的值。 传地址#xff0c;是传值的一种特殊方式#xff0c;只是他传递的是地址#xff0c;不是普通…值传递 引用传递传地址传引用的区别
传值是把实参的值赋值给行参 那么对行参的修改不会影响实参的值。 传地址是传值的一种特殊方式只是他传递的是地址不是普通的如int那么传地址以后实参和行参都指向同一个对象。 传引用真正的以地址的方式传递参数 传递以后行参和实参都是同一个对象只是他们名字不同而已对行参的修改将影响实参的值。
从函数调用的角度比较容易理解
函数的名字就是函数的首地址就是函数的入口例子(数组与之同理数组的名字就是数组的首地址)
void fun(void) //fun 既是函数类型也使指针类型 一体两面
{}
//数组也是同理short arr[20]; //arr 既是数组类型也是指针类型一个变量两个类型 应用场景不同则展示出来的效果不同如同一枚硬币的两面同属于这枚硬币既然 fun 是地址值那么 fun 是什么类型 指针类型因为它的本质是一个地址。 // 这称为函数指针 void ( *)(void) — void fun(void) int fun2(short s, int i){return 0;}↓int (*)(short, int) //fun2的类型函数调用 fun2(10,20);int (*p)(short, int) fun2; 将 fun2 赋值给其他值p fun2因为fun2的本质是一个地址所以接收类型应该是int (*)(short,int) p fun2; — 然而并没有这样的写法。这里有一个规律如果你看见 (*) 单独存在要将后面的东西放入到 *的后面语法规则即 写法为 int ( *p)(short, int) fun2;同理如果你看见单独存在的 []或者多个[] [] []将后面的东西放到[]的前面。例如数组的定义为存储类型 变量名字[元素个数]; — 数组类型short [20] — 定义数组short[20] arr(这样更易于理解但没有这种写法) — short arr[20]; 因为将fun2的值赋值给了 p所以下面两种调用是一致的 p(10,20); // fun2(10,20);形参 void fun(short s, int *p){}short a 10;int b 20;fun(a, b);值传递 将变量的值直接传给形参 // 比如 a 址传递 将变量的地址传给形参 // 比如 b void fun(int x, int *p){}int a 10;int b 20;int *xp b;fun(a, xp); // xp 是一个 值传递 而相对于 b 来说这才是一个址传递#include stdio.hint fun(int x, int y);
int main(void)
{int a 10, b 20;fun(a, b); //调用fun函数 -- 在内存中给 fun 函数开辟空间printf(%d %d\n, a, b); //a,b 没有变化因为CPU的寄存器中fun值传递后内存被释放a,b的值不变fun2(a); // 址传递获取到了a空间中存储的值在内存中开辟fun2 空间p 指针类型32位 4个字节/64位 8个字节printf(a:%d b:%d\n, a, b); // 300 20 // *x --- x return 0;
}int fun(int x, int y)
{x 100;y 200;return xy;
}void fun2(int *p)
{*p 300; //地址传递指针 p 解引用可以获取到这个指针指向的对应的空间它可以改变函数外面的某一个变量 传递结束后fun2 被释放
}
//因此 scanf(%d,a); 函数中的传参是取地址传递与上述 fun2 同理因为值传递内存释放后原有的数值不发生改变 而地址传递会获取到“房间”中的值并改变这个地址中存储的内容//函数的返回值 -- 定义与返回值前后一致
int *fun(void)
{int *p;return p;
}以上。便是值传递和地址传递的区别。
我是一个十分热爱技术的程序员希望这篇文章能够对您有帮助也希望认识更多热爱程序开发的小伙伴。 感谢