> 馆藏中心

C语言函数参数问题

来源:cnblogs 编辑:从大磊

首先,你得先区分2113const char* a和char* const a的区别。5261一个是把指针定为const 。就是不能修改指4102针。也就是char * const p一个是把指针指向的内容定1653为const 。就是不能修改指针指向的内容 也就是const char *p 在这里,const char* strSrc表示的是不能修改指针指向的内容,但是对于*strDest++=*strSrc++;只是在修改指针strSrc的指向,所以是可以成立并且执行的,不明白继续追问,我不是大师,我可以答么?www.179s.com防采集请勿采集本网。

1.C语言不支持函数的参数有默认值。

2.C++支持

要将函数名作为参数,需要使用函数指针。 函数指针的定义格式为 ret_type (*var_name)(arg_list); 表示返回值为ret_type,参数列表为arg_list的函数

3.C语言可以“实现”参数设置默认值,

a[MAX]是一个int型的变量(而且还越界了),而bubble的参数要求是int []型的变量……解决的方法是把bubble(a[MAX]);改为bubble(a);

  参考链接https://blog.csdn.net/pipisorry/article/details/25437893

你这个编译通不过吧,这个括号里面是什么鬼(x--,y++,x+y)函数又不是函数,条件也不是条件??????

      https://blog.csdn.net/broook/article/details/7208408收获园豆:5

const表示变量不可以改变。在函数入参中,有人习惯加入const,这样的意思是别人传递进来的数据是我要处理的,但是我不需要改变人家传递过来的数据。这样如果在

============================================

其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变 实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。

明白了,谢谢

============================================

其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变 实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。

那示例代码里第二行的name+0是什么意思呢?

============================================

其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变 实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。

@小宇宙zjy: 我也不懂

============================================

其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变 实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。

@Conan-jine: 好吧

※※2113※※※※※※※※※第一5261个问题的答复※※※※※※※※※※※※※※※看明4102白了你1653的意思, 其实不知道你自己有没有注意到,你所尝试的方法, 如果用C语言来做的话,其实就是实现了C语言的部分面向对象的实现, 说是"部分"的原因是,这仅仅是实现了面向对象的“方法”。 如果想实现的话,准确的讲,应该不是你所说的,将"函数"作为形参, 应该是将“函数指针”作为形参。 这个在回调(CallBack)函数设计时,使用的非常多, 简单举一个例子: #include <stdlib.h> #include <stdio.h> int Do1() { return 0; } int Do2(int num) { printf("The num is: %d\n", num); return 0; } void CallBack1(void (*ptr)())//指向函数的指针作函数参数 { (*ptr)(); } void CallBack2(int n, int (*ptr)())//指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的, { //不能写成void Caller2(int (*ptr)(int n)),这样的定义语法错误。 (*ptr)(n); return; } int main() { CallBack1(Do1); //相当于调用Do1(); CallBack2(50, Do2); //相当于调用Do2(50); return 0; } ※※※※※※※※※※※第一个问题的答复※※※※※※※※※※※※※※※※※※※※※※※※※※补充问题的答复※※※※※※※※※※※※※※※针对你的补充问题,解答如下: 这个是可变形参的实现,准确地说,不是通过数组实现的,而是通过栈实现的。 C语言中的printf,scanf就是最常见的可变形参函数,定义一个可变形参的函数很简单,如void print(int n, ...) ,函数中对参数的处理主要是通过对栈进行操作,而c函数的实参都是自右向左压入栈的. 主要的栈操作(都是宏)有va_list,va_start ,va_arg,va_end, 定义如下: typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start _crt_va_start #define va_arg _crt_va_arg #define va_end _crt_va_end #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define _crt_va_end(ap) ( ap = (va_list)0 ) va_start(ap,v):主要是获取可变参数列表的首地址,然后赋值给ap,近似ap=&v+sizeof(v) (这里暂不考虑内存对齐和类型转换) va_arg(ap,t):取得返回类型t的可变参数值, 并使ap指向下一个参数: ap += sizeof(t),这里的t是可变参数的数据类型,如int,float之类 va_end(ap):给ap初始化 va_start(ap,v) va_arg(ap,t) va_end(ap)三者合用,保证程序的健壮性. 一个使用可变形参的简单程序: #include <stdio.h> #include <stdarg.h> //包含va_list等定义 float sum( float first, ... ) //,...代表可变形参函数 { float i=first,sum=0; va_list maker; //va_list 类型数据可以保存函数的所有参数,做为一个列表一样保存 va_start(maker,first); //设置列表的起始位置 while(i!=-1.0) { sum+=i; i=va_arg(maker,float); //返回maker列表的当前值,并指向列表的下一个位置 } return sum; } void main(void) { printf( "sum is: %f\n", sum( 2.0,8.0,8.5,-1.0 ) ); //函数调用 }※※※※※※※※※※※补充问题的答复※※※※※※※※※※※※※※※,给你举个例2113子吧,这样就容易5261理解得多。 例子:设计一个函数func();在调用它时4102每次实现不同的函数功能1653,输入两个参数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(x>y?x:y); } int min(int x,int y) { return(x<y?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(); },可以使用函数指针,比2113如:void function(int x,void (*visit)())/*没有返回5261值,没4102有参数*/{/*其他代码*/visit();}void function(int x,void (*visit)(int))/*没有返回值,有1653整形参数*/{int y = x*x;/*其他代码*/visit(y);},用函数指针应该2113能解决吧,5261以下是我写的一个4102例子,TC编译1653通过:int test1(int i){ return i;}int test2(int a,int (*fp)(int a)){ return fp(a);}main(){ printf("%d",test2(5,test1)); getch();},引用:#include <iostream> using namespace std; typedef int (*PFUN)(int a, int b);//函数指针5261 int add(int a, int b) { return (a+b); } void fun(int a, int b, PFUN pfun)//函数指针作为函数的4102参数 { cout << pfun(a,b) <<endl; } int main() { int a=5; int b=6; PFUN pfun=add;//将函数指针指向1653add fun(a, b, pfun); return 0; }内容来自www.179s.com请勿采集。

本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。本文《C语言函数参数问题》转载自cnblogs,版权归原作者所有,若侵权请联系:E-MAIL:513175919@qq.com
违法违规信息请立即联系本网可获得现金奖励,TEL:1-8-2-1-0-2-3-3-3-8-1(电话仅供违法违规信息举报,侵权类信息请EMAIL。)

www.179s.com false 互联网 http://www.179s.com/jsblogcnk/po/pokphv.html report 6558 1.C语言不支持函数的参数有默认值。2.C++支持3.C语言可以“实现”参数设置默认值,  参考链接https://blog.csdn.net/pipisorry/article/details/25437893      https://blog.csdn.net/broook/article/details/7208408收获园豆:5============================================明白了,谢谢========================

热门图片

经济金融企业管理法律法规社会民生科学教育降生活体育运动文化艺术电子数码电脑网络娱乐休闲行政地区心理分析医疗卫生