c语言c语言数组作为函数参数问题

C语言中函数类型以及函数参数类型的关系
[问题点数:40分]
本版专家分:0
CSDN今日推荐
本版专家分:15572
2014年11月 C/C++大版内专家分月排行榜第二2014年10月 C/C++大版内专家分月排行榜第二2014年8月 C/C++大版内专家分月排行榜第二
本版专家分:36513
2011年9月 Linux/Unix社区大版内专家分月排行榜第一2008年11月 C/C++大版内专家分月排行榜第一
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
本版专家分:2971
2014年10月 VC/MFC大版内专家分月排行榜第二2014年9月 VC/MFC大版内专家分月排行榜第二
本版专家分:15572
2014年11月 C/C++大版内专家分月排行榜第二2014年10月 C/C++大版内专家分月排行榜第二2014年8月 C/C++大版内专家分月排行榜第二
本版专家分:3718
2014年8月 C/C++大版内专家分月排行榜第三
本版专家分:369664
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:2971
2014年10月 VC/MFC大版内专家分月排行榜第二2014年9月 VC/MFC大版内专家分月排行榜第二
匿名用户不能发表回复!
其他相关推荐void f(int a) {
int main() {
int b = 2;
例子中:a是形参,b是实参
传递过程&&内存情况:
在被调用前,函数的形参是不分配内存的,也就是说,不调用f()的话,a不在内存里面
一旦调用了函数,马上为函数的形参分配内存,此时分配一个int空间大小的内存给a,此时,a和b在内存中都有内存(不同的内存),传参的时候,程序传递实参的值给形参
所以:在f函数内部改变参数的值,只改变了形参的值,形参在函数结束后被释放,main里面的b值不变
当形参是数组的时候:
void f(int a[]) {
int main() {
int b [5] = {1,1,1,1,1};
此时情况有变,实际上这种情况下实参传递的是数组的首地址,那么一旦调用函数的时候,内存里会存在两个指针变量(一个形参一个实参),这两个变量指向同一位置,当然,函数内改变形参的值不会使得main里的实参地址发生变化,但是,由于两个参数指向同一位置,所以,通过形参来改变数组元素的值之后,main里面的实参在去访问数组的时候,数组的值已经改变
&和*的区别:
例子:int *b = &a;
&符号用来处理一个变量,但不是通常的-访问这个变量的内容,而是取出这个变量的地址
int *b;此时b是一个指向int空间的指针,也就是说它是一个未分配的地址
int*只用来定义,定义的变量是一个地址(索引),可以通过这个变量来对这段空间操作
而&是对一个已存在的变量取地址,取完地址之后同样可以通过地址操作
*x是找到x地址的变量,取它的值,所以*和&是反操作,&x得到x的地址*,*x得到x的值x
C语言 数组做函数参数
C++中函数的数组形参
数组引用:C++ 数组做参数 深入分析
数组作为形式参数
C++学习 - 数组参数传递及编程技巧
如何使用数组参数
C语言,数组做形参
数组的形参与实参,通过引用传递数组
数组作为函数参数传递
没有更多推荐了,c语言主函数加参数的问题_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
c语言主函数加参数的问题
阅读已结束,下载本文需要
定制HR最喜欢的简历
你可能喜欢协议,协议,说白了就是一大堆代码,刚接触真的有种无边无际的感觉,继续LwIP协议学习,在看代码的过程中,遇到了回调函数参数传递的问题(多参传递),确实是自己的C语言功底不深,上网搜了下,都是单个参数传递,以下是网友少占鱼的网易写的博文:
看了人家的例子,比看那么多定义好多了。一看就明白了。好人啊!老外把国人玩的不是人了。国人还自己玩自己。非把一个简单的东西复杂化。叫那么难理解!!完啦,窝里斗的典型!!!!!!!!
回调函数:我的理解。假设&& A是回调函数,B是调用者,B参数里一个是指向A的函数指针,即回调A,同时另外的参数传递给A作为参数。A可以是多个函数的统一指向,只要函数参数个数相同即可。
WINDOWS回调函数:永远不会被程序中的其他函数或子程序调用。只能由操作系统调用。因此,windows可以通过传递不同参数给回调函数达到和程序沟通的目的。&
那么:B调用A,A也有参数,有参数就要赋值才行。所以B函数内部给A参数赋值。B调用A,A又利用了B给的参数。
A就是回调函数。B就是调用者。
int* func(int params, ...); //这就是指针函数
当一个函数的返回值是一个指针时,该函数就是一个指针函数。
函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。
同比指针变量指向数组首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。
&回调函数参数可以空或者定义成void类型。方便不同类型的数据传入。通用性强。
&int sort_function( const void *a, const void *b);&& //参数类型是void 两个参数。传入参数可以任意类型。更通用。 回调函数的实现,参数也用void。类型由调用者传的参数决定。
#include&stdio.h&
// 方法指针的格式为:int (*ptr)(char *p) 即:返回值(指针名)(参数列表)
typedef int (*CallBackFun)(char *p); // 为回调函数命名,类型命名为 CallBackFun,参数为char *p 。
//下面是两个被调用者,就是回调函数的实现。回调函数是他们的统一格式。
int Afun(char *p)
{ // 方法 Afun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf(&Afun 回调打印出字符%s!\n&, p);
}int Cfun(char *p) { // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一个 CallBackFun
printf(&Cfun 回调打印:%s, Nice to meet you!\n&, p);
/*********************************************************************/
//下面的这些是调用者:有几种方式,看你喜欢哪种
int call(CallBackFun pCallBack, char *p)
&{&& &// 执行回调函数,方式一:通过命名方式
printf(&call 直接打印出字符%s!\n&, p);
pCallBack(p);
/*********************************************************************/
int call2(char *p, int (*ptr)())
{&&&& // 执行回调函数,方式二:直接通过方法指针
printf(&==============\n&, p);&
(*ptr)(p);&
/*********************************************************************/
int call3(char *p, CallBackFun pCallBack)
{&&&&& // 执行回调函数,方式一:通过命名方式
printf(&--------------\n&, p);
pCallBack(p);&
/*********************************************************************/
int main()
char *p = &hello&;
call(Afun, p);&& //调用Afun回调函数,传递参数*P给Afun函数
&call(Cfun, p); //调用Cfun回调函数,传递参数*P给Afun函数
call2(p, Afun); //调用Afun回调函数,传递参数*P给Afun函数
&&& call2(p, Cfun); //调用Cfun回调函数,传递参数*P给Afun函数
call3(p, Afun);& //调用Afun回调函数,传递参数*P给Afun函数
&&& call3(p, Cfun); //调用Cfun回调函数,传递参数*P给Afun函数
// int i = getchar();
// printf(&Input: %c \n&, i);
好吧,感觉他什么都没说,就是讲了函数指针的使用,看有没有大神能解释下面的回调函数参数的传递:
/*-----------------------------------------------------------------------------------*/
httpd_init(void)
& struct tcp_pcb *
& /* Create a new TCP control block& */
& pcb = tcp_new();
& /* Assign to the new pcb a local IP address and a port number */
& /* Using IP_ADDR_ANY allow the pcb to be used by any local interface */
& tcp_bind(pcb, IP_ADDR_ANY, 80);
& /* Set the connection to the LISTEN state */
& pcb = tcp_listen(pcb);
& /* Specify the function to be called when a connection is established */&&&&&&&&
& tcp_accept(pcb, http_accept);//回调函数 http_accept
http_accept如下定义:
/*-----------------------------------------------------------------------------------*/
static err_t
http_accept(void *arg, struct tcp_pcb *pcb, err_t err)//这几个参数是怎么传递过来的
& struct http_state *
& u32_t IP
& u8_t iptxt[20];
& volatile u8_t iptab[4];
& IPaddress = pcb-&remote_ip.
& printf(&\n\rhttp_accept:%d.%d.%d.%d\n\r&, (u8_t)(IPaddress),
&&&&&&&&&&&&&&& (u8_t)(IPaddress && 8),(u8_t)(IPaddress && 16),(u8_t)(IPaddress && 24));
& /* read its IP address */
& iptab[0] = (u8_t)(IPaddress && 24);
& iptab[1] = (u8_t)(IPaddress && 16);
& iptab[2] = (u8_t)(IPaddress && 8);
& iptab[3] = (u8_t)(IPaddress);
& sprintf((char*)iptxt, &Http: %d.%d.%d.%d&& &, iptab[3], iptab[2], iptab[1], iptab[0]);&
& LCD_DisplayStringLine(Line6, iptxt);
& /* Allocate memory for the structure that holds the state of the
&&&& connection. */
& hs = mem_malloc(sizeof(struct http_state));
& if (hs == NULL)
&&& return ERR_MEM;
& /* Initialize the structure. */
& hs-&file = NULL;
& hs-&left = 0;
& /* Tell TCP that this is the structure we wish to be passed for our
&&&& callbacks. */
& tcp_arg(pcb, hs);
& /* Tell TCP that we wish to be informed of incoming data by a call
&&&& to the http_recv() function. */
& tcp_recv(pcb, http_recv);
& tcp_err(pcb, conn_err);
& tcp_poll(pcb, http_poll, 10);
& return ERR_OK;
对了,pcb是进程控制块,不是印刷电路板,它是结构体,那是我见过的最大的结构体,少说有30个元素,就不贴出来了。
& 2010 - 2018 苏州灵动帧格网络科技有限公司 版权所有.
ICP经营许可证 苏B2-&C语言函数详解!
TA的更多文章
C语言函数详解!
结构化编程标准&1)程序控制流尽可能简单&2)应该自顶向下地设计程序结构自顶向下设计(top-down design),也称逐步细化(stepwise refinement),把一个问题分解为几个小问题的组成.函数调用&程序的执行总是从main()开始.当程序控制遇到一个后跟有括号的函数名时,就调用或请求(call或invoke)函数.C语言函数语法type function_name (parameter type list){
& &declarations
& &statements
}函数的类型(type)就是函数的返回值类型,如果没有返回值,就使用关键字void.参数类表(parameter type list)描述了调用函数时传递给函数的参数个数和类型,如果不传递参数就用void.&把函数定义中的参数称为形式参数(formal parameter),用以强调它作为占位符的角色,在调用函数时传递给函数的实际值要传递给形式参数.函数原型&函数应该先声明后使用.函数声明语法使用函数原型(function prototype).函数原型告诉编译器传递给函数的参数的个数和类型以及返回值的类型.&type function_name (parameter type list);参数类型表通常是用逗号分隔开的类型列表.在表中可以没有标识符,标识符不会影响原型.例如void f(char c, int i);等价于void f(char, int);如果函数没有参数,就使用关键字void,如果函数没有返回值也是用关键字void函数的擦书个数是不确定的,name就用省略号(…)函数原型可使得编译器彻底地检查代码.强制转换传递给参数的值.例如,函数声明的时候,限定传入的参数是double类型,但是传进去了一个int类型,这个int类型的参数会强制转换为double类型.在标准头文件stdio.h含有printf()和scanf()的函数原型,函数原型是一种函数定义,为了正确的编译,编译器需要知道传递给函数的参数个数和类型以及函数返回值的类型.void def(int k);&def是函数原型,该函数类型是void,他告诉编译器该函数没有返回值.擦书列表是int,它告诉编译器这个函数有一个类型为int的参数.**assert()**assert.h中提供了assert()宏,这个宏能用于保证表达式的值是程序员所希望的.
`assert(a&0);
如果断言失败,系统就要显示出一个信息并终止程序.它增强了代码的健壮性,并有助于代码的阅读者理解其用意,也有助于保证函数的行为满足要求.
**程序编写次序**1.把#include和#define放在文件头部2.枚举类型和结构类型3.函数原型列表4.main()函数int max(float a,float b){ & &return(a&b)?a:b;
}当返回值类型和函数定义类型不一致时,以函数定义类型为准,如上例,返回浮点型,而定义为整形,则会强制转换为整形。当不需要返回值的时候,则在函数定义时用void声明C语言中不能在函数中定义函数,既没有闭包1如果看了对你有帮助的话别忘记赏up一个大拇指和硬币哦up自己的C语言交流qun:谢谢大家的支持
本文禁止转载或摘编}

我要回帖

更多关于 c语言函数参数是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信