
正文
C语言函数参数地址互换 c语言函数形式参数取地址符
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
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;
}
以上代码运行结果如下:
以下代码实现了使用宏定义作为模板,声明不同类型交换函数的功能,以下以声明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;
}
运行结果如下:
相关问答
Q1: c语言交换值问题,想要通过交换地址改变值。但是为什么不行,具体问题给了代码,求解答,谢谢
C语言C语言函数参数地址互换的函数形式参数是函数的局部变量C语言函数参数地址互换,C语言函数参数地址互换你把实参地址值传给形参指针,在函数中交换只在函数中起作用,影响不到主调函数中实参指针的值。要想改变主调函数中的变量值,函数中得通过接收到的地址值改变其指向的变量值,这样的操作才是可行的,比如把C语言函数参数地址互换你的函数改成——
void excha(int*a,int *b)
{
int t;
t=*b;
*b=*a;
*a=t;
}
这样改交换的就不是函数中的a和b指针,而是指针指向的*a和*b,由于*a和*b就是主调函数中的p1和p2,所以它们的值才能发生变化。
Q2: C语言中函数调用,为什么交换了地址,可是所指的值还是不变那????
#includestdio.h
void swap(int *a,int *b)
{
int t=0;
t=*a;
*a=*b;
*b=t;
}
int main()
{
int x=3,y=5;
int *p=x,*q=y;
swap(p,q);
printf("%d %d\n",*p,*q);
printf("%d %d\n,a,b); //看看是不是 a,b也改变了!~!
}
你那个错误,我的估计: 你可以用vc++单步调式一下.也可以完全理解的.
p=x 就是把 x的地址保存在 指针 p中. *p 就是得到 值. *p=3.
q也差不多.
你下面 sqap(p,q) . 就是把地址传过去了.
可是传回来的值没有改变,为什么呢!
原因很简单.
因为你的
int *t;
int*t;
t=a;a=b;b=t;
交换的是 a和b 的地址.
不要忘记了,当调用一个函数时.
os会为 swap 函数中的 int *a,int *b.开辟内存.
你改变的是swap开辟的内存.并没有改变 main中的*p和*q内存区域.
我再说清楚点.
p 保存的是 a q保存的是 b
swap函数 a 保存的也是 a b保存的也是b
你用交换了 a和b的 地址.有什么用.没有改变原来的地方的地址.
只是改变了你自己的 a 和 b里面的地址. 没有改变那边的 真正的 3 和 5.
如果用了
int t;
t=*a;
*a=*b;
*b=t;
就是间接去改变那边的值.
通过里面 a,b,的地址来找到 真是的 3,5 然后就改变了.
Q3: C语言中如何交换两个指针变量的的值
1、首先,就是最基本C语言函数参数地址互换的知识,写头文件、函数声明、定义变量。
2、下面还需要定义指针,需要定义两个指针p1和p2,然后把a的地址赋值给p1,把b的地址赋值给p2。
3、然后就是调用函数,该函数没有返回值,就直接调用,但是参数进入的是a和b的地址,而不是a和b。
4、函数点用完之后,就是输出a和b的值看一看是否互换C语言函数参数地址互换了。
5、首先,a和b的地址传给x和y,通过指针直接对a和b的值进行操作。
6、最后,就是调换*x和*y的值,这样就是实现了a和b的值。
Q4: 在C语言中的 交换指针地址问题
值传递在函数调用过程中,函数内部将参数拷贝一份,而并不改变元参数的值。而指针传递,才在函数内部改变传入参数的值。如果你要传入的参数是指针,可以改变的是指针指向的具体内容的值,而你如果要在函数内部改变指针的值,你需要传入的是指针的地址,也就是指针的指针。将你的Change函数的参数改为(int **p, int **q), 然后再调用的时候改为change(p, q)即可。
希望对你又帮助。
Q5: C语言指针传参,目的是通过子函数交换实参地址,实现形参和实参的双向传递。但不能通过编译,求解。
看起来对函数调用和指针的概念有误解C语言函数参数地址互换,形参和实参永远不能互相修改,因为在栈的不同位置存储。C语言函数参数地址互换我们提出的双向传递是,通过把原来的当做实参变量的地址当做实参传入函数,在函数内部通过修改指针形参指向的地址来把值传递出函数;作为变量地址的实参依然不可能在函数内部被修改。
C语言函数参数地址互换的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言函数形式参数取地址符、C语言函数参数地址互换的信息别忘了在本站进行查找喔。








