
正文
c语言函数变参数的问题 c语言函数改变实参
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言中用函数做函数的形式参数的问题
给你举个例子吧,这样就容易理解得多。
例子:设计一个函数func();在调用它时每次实现不同的函数功能,输入两个参数a和b,第一次调用func()时找出a和b中的较大者,第二次调用找出较小者,第三次调用求a和b之和。
说明:格式
(*p)()
表示定义一个指向函数的指针变量p,在c语言中这个格式是固定的,前面的()表示p先和*结合,是指针变量,后面的()表示p指向一个函数。前面的()不能省略,如果写成
*p(),由于()优先级比*高,那就表示p()函数返回的是一个指针,p本身就是函数不是指针了,意思完全变了。
任何一个函数,函数名就是该函数的入口地址(起始地址),也就是说函数名就是个地址,从这个地址开始,函数占用一段内存单元。因此可以用一个指针变量来指向这个这个函数名,这样就相当于指向这个函数了。所以下面的max,min,add函数都是一个地址,分别调用时就是赋值p=max,p=min,p=add,也就是(*p)(x,y)分别就等于max(x,y),min(x,y),add(x,y).
程序在win-tc和Dev-c++下调试通过。
#include
stdio.h
#include
conio.h
int
max(int
x,int
y)
{
return(xy?x:y);
}
int
min(int
x,int
y)
{
return(xy?x:y);
}
int
add(int
x,int
y)
{
return(x+y);
}
int
func(int
x,int
y,int
(*p)())
/*定义指向函数的指针变量p,关键1*/
{int
result;
result=(*p)(x,y);
/*调用相应函数,函数名即地址给p,这样p指向该函数,关键2*/
printf("%d\n",result);
}
main()
{
int
a,b;
printf("Please
input
two
integers
a
and
b:\n");
scanf("%d%d",a,b);
printf("max=");
func(a,b,max);/*相当于赋值p=max*/
printf("min=");
func(a,b,min);/*相当于赋值p=min*/
printf("add=");
func(a,b,add);/*相当于赋值p=add*/
getch();
}
相关问答
Q1: c语言如何用自定义函数改变参数的值
可以传递指针作为参数。如:使用swap(a,b)实现交换a、b两个实参的值。
void swap(int *pa, int *pb)
{
int t=*pa;
*pa=*pb;
*pb=t;
}
int main()
{
int a=1, b=2;
swap(a,b);
}
Q2: C语言奇淫技巧之函数的可变参数
前言:
有时候我们需要一个函数接口可以支持可变参数以提高其泛化能力c语言函数变参数的问题,比如说定义一个求和函数c语言函数变参数的问题,对传入c语言函数变参数的问题的所有参数进行求和并返回,C语言提供c语言函数变参数的问题了一种可变参数的方式来帮助我们实现。
原理:
函数参数是从右向左线性连续依次入栈,如果我们可以知道可变参数列表的前一个参数的地址和类型,就可以得知可变参数列表的首地址,进而根据每个参数的类型取出相应的数据。简单来说就是将栈里面的数据,按照指定类型的大小,依次取出。
具体实现:
步骤解析:
Q3: c语言中函数可否改变参数值
#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
x);
printf("y
=
%d
at
[%x]n",
y,
y);
printf("z
=
%d
at
[%x]n",
z,
z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
运行结果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序栈底为高地址,栈顶为低地址,因此上面的实例可以说明函数参数入栈顺序的确是从右至左的。可到底为什么呢?查了一直些文献得知,参数入栈顺序是和具体编译器实现相关的。比如,pascal语言中参数就是从左到右入栈的,有些语言中还可以通过修饰符进行指定,如visual
c++.即然两种方式都可以,为什么c语言要选择从右至左呢?
进一步发现,pascal语言不支持可变长参数,而c语言支持这种特色,正是这个原因使得c语言函数参数入栈顺序为从右至左。具体原因为:c方式参数入栈顺序(从右至左)的好处就是可以动态变化参数个数。通过栈堆分析可知,自左向右的入栈方式,最前面的参数被压在栈底。除非知道参数个数,否则是无法通过栈指针的相对位移求得最左边的参数。这样就变成了左边参数的个数不确定,正好和动态参数个数的方向相反。
因此,c语言函数参数采用自右向左的入栈顺序,主要原因是为了支持可变长参数形式。换句话说,如果不支持这个特色,c语言完全和pascal一样,采用自左向右的参数入栈方式
Q4: C语言函数调动参数问题
#include stdio.h
//指针加*是不会改变其指向c语言函数变参数的问题的c语言函数变参数的问题,只会修改其中的内容
int *f(int *s, int *t) //s指向i,t指向j
{
if (*s *t) //这里比较的是i与j的值
{
*s = *t; //*s表示取s地址的内容,即i,所以*t是表示j,这里是将j赋值给i
//所以改变c语言函数变参数的问题了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;
}
运行结果是c语言函数变参数的问题: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;
}
运行结果c语言函数变参数的问题: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指向的变量赋值,如果没有加*就是改变指针的指向。
Q5: C语言 函数变参数的问题(va_list,va_start,va_arg,va_end)
va_start (ap, num);
这句话用错c语言函数变参数的问题了c语言函数变参数的问题,va_start 是用来初始化ap的,num应该改为传递的第一个对象,也就是item。
loc_item = va_arg(ap,Item);
这句的作用是loc_item 被赋给ap的下一对象的值。
#include stdio.h
#include stdarg.h
typedef struct item
{
char name[20];
char kind[20];
}Item;
void showname (Item locitem,...);
void main ()
{
Item locitem1 = {"aaa","aaa"};
Item locitem2 = {"bbb","bbb"};
showname (locitem1,locitem2);
}
void showname (Item item,...)
{
va_list ap;
Item loc_item;
va_start (ap, item);//修改了这里
loc_item = va_arg(ap,Item);
printf("%s is %s\n",loc_item.name,loc_item.kind);
printf("other:%s is %s\n",item.name,item.kind);
va_end (ap);
}
显示结果为c语言函数变参数的问题:
bbb is bbb
otherc语言函数变参数的问题:aaa is aaa
关于c语言函数变参数的问题和c语言函数改变实参的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








