c语言函数中的传递地址和传递变量值什么意思?有什么区别?引用从老师那听来的比方:
值传递就相当于直接告诉你,银行卡里有多少钱;我告诉你了,你只能知道这个数,我的账户你用不了,你可以自己开个户,也存这么多钱;
地址传递就是我把账户密码告诉你了,你可以自己查这个账户里有多少钱,你高兴了可以从1000变成2000,也可以从1000变成0;看你想怎么用;
我的账户就相当于地址,账户里的钱就是值;
希望可以帮到你
C语言数组的地址传递和值传递1.值传递就不写了,顾名思义就是把当前的值传到下一个函数中,变量本身的没有发生任何变化
2.指针传递,把当前变量指针传到下一个函数,在另外函数里边修改指针的值会修改当前变量值
#include stdio.h
void func(int *p){
*p = 9;
return;
}
void swap(int *a, int *b){ //交换两个变量的值
int temp = *a;
*a = *b;
*b = temp;
}
int main(void){
int a = 0;
func(a); //要修改一个变量,把他的地址传过去
printf("%d",a);//9
int b = 3;int c = 4;
swap(b,c);
return 0;
}
说C语言中函数值传递与地址传递的方法先举个简单例子:
#include iostream
using namespace std;
void Add1(int *a)
{
(*a);
}
void Add2(int a)
{
a;
}
int main()
{
int x=1,y=5;
Add1(x);
Add2(y);
coutx" "yendl;
return 0;
}
输出:
2 5
这两个自加函数中 , Add1是指针传递,Add2是数值传递,
在调用Add2(y)时 , 系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a,却对y没有任何操作 , 故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与x是指向同一地址 , 即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作 。a时自然也对x,当函数调用结束,指针a释放掉,x的值此时已经发生了变化 。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样 。
至于选择那种传递 , 就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递 。
还有什么不明白吗
c语言传值和传地址输出:
调用函数前输出结果:
nums[1]=0
nums[2]=0
nums[3]=0
nums[4]=0
value = https://www.04ip.com/post/0
因为循环变量初值是1 , 所以nums[0]不会输出
findMax(nums,value); //调用findMax,vals指向nums开始元素,m=0
i=1;[i=1] , iMAXELS成立 , 开始循环,vals[i]=1,nums[0,1,0,0,0],输出:vals[1]=1
i;[i=2],iMAXELS成立,继续循环,vals[i]=1,nums[0,1,1,0,0],输出:vals[2]=1
i;[i=3] , i5成立,继续循环,vals[i]=1,nums[0,1,1,1,0],输出:vals[3]=1
i;[i=4],i5成立,继续循环,vals[i]=1,nums[0,1,1,1,1],输出:vals[4]=1
i;[i=5],i5不成立,结束循环,输出:m=1
函数返回,m被舍弃 , 输出:
调用函数后输出结果:
nums[1]=1
nums[2]=1
nums[3]=1
nums[4]=1
value = https://www.04ip.com/post/0
由于子程序中没有计算过m,所以m值一直是初始的1,这个m是函数自己临时定义的变量 , 用来接收调用者传进来的参数,main函数将vale的值0传递给m,计算完后,函数返回,m被舍弃,不会影响value的值(作为参数 , 是取value的值来用一下,然后就没有value的事了)
如果想将m的值返回,那么有两种办法:
函数写成:void findMax(int vals[],int *m),然后函数中用到m的地方都改成*m,调用时findMax(nums,value);
函数写成:int findMax(int vals[],int m),函数最后写return m;调用时value=https://www.04ip.com/post/findMax(nums,value);
如果子程序不需要value作为m的初始值 , 则可省略第2个参数:int findMax(int vals[]),调用:value=https://www.04ip.com/post/findMax(nums);
5、使用C语言编写一个函数 , 用于交换两个变量的值(地址传递) 。不知道你要交换的两个变量类型,所以这里以整型数据交换为例,以下swap函数实现了交换两个整型变量值的功能:
#include stdio.h
// 交换给定指针指向整型变量的值 。
// 参数:
//a - 指向第一个变量的指针
//b - 指向第二个变量的指针
void swap(int* a, int * b);
int main(int argc, int argv)
{
int a = 3, b = 5;
printf_s("交换前:a = %d, b = %d\n", a, b);
swap(a, b);
printf_s("交换后:a = %d, b = %d\n", a, b);
return 0;
}
// 交换给定指针指向整型变量的值 。
// 参数:
//a - 指向第一个变量的指针
//b - 指向第二个变量的指针
void swap(int* a, int* b)
{
// 声明一个临时变量,保存第一个指针指向变量
// 的值 。
// 其中 *a 是取出 a 指针指向变量的值
int temp = *a;
// 将 b 指针指向的值赋值给 a 指针指向变量
(*a) = (*b);
// 将临时变量 temp 中保存的 a 指针指向变量的值赋值给
// b 指针指向的变量 。
(*b) = temp;
}
以上代码运行结果如下:
【c语言函数传递变量地址 c语言中变量地址】以下代码实现了使用宏定义作为模板,声明不同类型交换函数的功能 , 以下以声明double和float为例:
#include stdio.h
// 声明一个函数代码模板,逻辑参考 swap(int* a, int* b)
#define DEF_SWAP_FUNC(Type) void swap_##Type(Type* a, Type* b) \
{ \
Type temp = (*a); \
(*a) = (*b); \
(*b) = temp; \
}
// 使用模板声明并实现一个 double 类型变量交换函数,函数名为 swap_double
DEF_SWAP_FUNC(double)
// 使用模板声明并实现一个 float 类型变量交换函数,函数名为 swap_float
DEF_SWAP_FUNC(float)
int main(int argc, int argv)
{
// double 类型数据交换
double da = 5.6, db = 3.5;
printf_s("double 交换前:da = %lf, db = %lf\n", da, db);
swap_double(da, db);
printf_s("double 交换后:da = %lf, db = %lf\n", da, db);
// float 类型数据交换
float fa = 3.4, fb = 6.8;
printf_s("float 交换前:fa = %f, fb = %f\n", fa, fb);
swap_float(fa, fb);
printf_s("float 交换前:fa = %f, fb = %f\n", fa, fb);
return 0;
}
运行结果如下:
c语言函数传递变量地址的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中变量地址、c语言函数传递变量地址的信息别忘了在本站进行查找喔 。
推荐阅读
- 英伟达显卡大更新怎么关,英伟达显卡更新软件
- 动视暴雪开发什么游戏,动视暴雪什么时候合并的
- 小程序制作代码作业怎么写,小程序布置作业
- 怎么在mysql中删除表 mysql怎么删除数据表
- 公司说的sap是什么意思,saP是什么意思
- 手机语音通话怎么保存,怎么语音存电话号码
- 免费国外节点服务器号,国外节点搭建
- php适合多大数据 php可以支持目前主流的数据库
- 在微博如何推广网店,如何在微博推广自己的产品