c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。
成都创新互联专业为企业提供阿克苏网站建设、阿克苏做网站、阿克苏网站设计、阿克苏网站制作等企业网站建设、网页设计与制作、阿克苏企业网站模板建站服务,10多年阿克苏做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。
因此,使用swap函数进行数据交换时,必须保证两点:
1.
参数必须是指针类型,指向待交换的数据
2.
交换时,必须交换地址中的数据,而不是交换地址本身。
参考代码:
//错误的交换代码1
void swap1( int a, int b ) //参数不是待交换数据的指针
{
int t=a;
a=b;
b=t;
}
//错误的交换代码2
void swap2( int *a, int *b )
{
int *t=a;//交换形参变量本身
a=b;
b=t;
}
//正确的交换代码
void swap( int *a, int *b )
{
int t=*a;//交换形参变量地址中的数据,指针变量不变
*a=*b;
*b=t;
}
C语言可以通过传递指针来改变变量的值:
int
a=5;
void
f(int
*a)
{
*a
=
6;
}
调用函数
f(a);
则现在
a=6;
#include stdio.h
//指针加*是不会改变其指向的,只会修改其中的内容
int *f(int *s, int *t) //s指向i,t指向j
{
if (*s *t) //这里比较的是i与j的值
{
*s = *t; //*s表示取s地址的内容,即i,所以*t是表示j,这里是将j赋值给i
//所以改变了i的值,但是并没有改变s与t的指向,还是分别指向i与j
}
return s;
}
int main()
{
int i = 3, j = 5;
int *p = i; //p是指向i的
int *q = j; //q是指向j的
int *r;
r = f(p, q); //将s的地址赋值给r
printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);
return 0;
}
运行结果是:5, 5, 5, 5, 5
#include stdio.h
int k = 5;
void f(int *s) //这里传参只是将p的地址赋值给s,也就是将s指向了m
{
s = k; //将s指向k,并没有改变p的指向
}
int main()
{
int m = 3;
int *p = m;
f(p); //所以程序执行完,p还是指向m,而s是指向k的
printf("%d, %d\n", m, *p);
return 0;
}
运行结果:3, 3
#include stdio.h
//指针加*是不会改变其指向的,只会修改其中的内容
//如果指针不加*,则赋值就是改变其指向
int *f(int *s, int *t) //s指向i,t指向j
{
if (*s *t) //这里比较的是i与j的值
{
s = t; //s表示的是指针,这里不是表示其内容,所以这里是将t指向的地址赋值给了s
//也就是s与t是指向同一块内存空间,也就是将s也指向了j
}
return s;
}
int main()
{
int i = 3, j = 5;
int *p = i; //p是指向i的
int *q = j; //q是指向j的
int *r;
r = f(p, q); //将s的地址赋值给r,r也指向了j
printf("%d, %d, %d, %d, %d\n", i, j, *p, *q, *r);
return 0;
}
运行结果:3, 5, 3, 5, 5
这一类题目其实只要打个草稿就行了,写两个数字,然后*p就是表示取其中的内容,p就表示其指向(也就是内容的地址),只要是加*的赋值就表示改变其p指向的变量赋值,如果没有加*就是改变指针的指向。
当然可以,最典型的就是printf函数了,这个函数采用的就是可以改变形参数量的方法,百度上搜索:“C语言不定参数”就可以查到相关信息了C语言中的不定参数