详解C语言函数

函数的定义

函数的定义如下:

类型  函数名(形式参数)
{
   代码块
}

代码块包含了局部变量的声明函数调用所要执行的语句

return语句

return 语句的语法如下:

return expression;

  当执行流执行到return语句时函数被返回到被调用的地方,return语句允许在任何地方返回,并不要一定在函数的末尾。
  表达式expression是可选的,如果函数不需要向调用程序返回一个值,就可以被省略,这种没有返回值的函数可以在声明的时候将其函数的类型置为void
  函数是从内部表达式调用的,它必须返回一个值,用于表达式的求值,这类函数的return语句必须包含一个表达式,通常函数的类型就是表达式的类型。
只有当编译器可以通过通常的算数转化把表达式的类型转化为正确的类型时,才允许返回值的类型与函数的类型不一致

函数的声明

  如果没有函数的声明信息,编译器便假定这个函数的调用时的参数类型和数量是正确的,它同时假定函数的返回值类型是整型

原型

  向编译器提供一些关于函数的信息显然是很安全的,我们可以通过两种方法来实现:

  • 如果同一源文件的前面已经出现过该函数的定义,编译器会记住它的参数数量和类型,以及函数的返回值类型。接着编译器会检查该函数的后续调用,确保它们是正确的。
  • 向编译器提供函数的原型,使用原型最安全的方法是把原型置于一个单独的文件,当其它文件需要原型时,就使用#include指令包含改文件。

  原型的定义如下:

int  *find_int(int key,int array[],int len);

  函数原型的使用如下:

#include "func.h"
void a()
{
  func(&a,b);
}
文件func.h包含了函数func的声明
int func(int *value,int len);

函数的原型同时也被#include包含到定义函数的文件中,编译器就可以确认函数的定义与函数的原型必须匹配

  区分函数原型函数定义的是后面那个分号(;)

函数的缺省认定

  当函数调用一个无法见到原型的韩束时,编译器认为该函数返回一个整型值。对于那些并不是返回值为整型值的函数调用,这可能引起错误。

值的类型并不是值得内在本质(固有属性),而是取决于它使用的方式。

函数的参数

两个概念:
1.传值调用:传递给被调用函数的是实参的一份拷贝,函数可以放心的修改这个拷贝值,而不用担心会修改调用程序实际传递给它的参数。
2.传址调用:传递给被调用函数的是指针的一份拷贝,假如传递的是数组名,并且在函数中使用下标引用该数组的值,那么在函数中对数组元素的修改其实修改的是调用程序中的数组元素,数组并不会复制。

数组参数的这种行为似乎与传值调用相悖,其实不然,数组名其实就是一个指针,传递函数的就是该指针的一份拷贝,下标应用也是间接访问的一种,所以这份拷贝进行间接访问操作访问的是原先的数组

总结

  • 传递给函数的标量都是传值调用
  • 传递给函数的数组参数在行为上就像他们是通过传址调用一样。

可变参数列表

  让一个函数在不同的时刻接受不同数目的参数。

stdarg宏

  可变参数列表是通过来实现的,这些位于stdarg.h,这个头文件声明了一个类型va_list和三个宏——va_start,va_arg,va_end
  可变参数列表实现的步骤

  • 用类型va_list声明一个变量var_arg,它用于访问参数列表的未定部分;
  • var_arg变量用va_start来初始化,它的第一个参数是va_list变量,第二个参数是省略号前最后一个有名字的参数,初始化过程把var_arg变量设置为指向可变参数部分的第一个参数;
  • 用va_arg访问参数,这个宏接受两个参数,va_list变量和参数列表中下一个参数的类型
  • 当访问完参数后,调用va_end;

实例演示:求平均数

#include<stdarg.h>
float average(int n_values,...)
{
  valist var_arg;    //声明va_list类型的变量
  int count;
  float sum = 0;
  /*
  *准备访问可变参数
  */
 va_start(var_arg,n_values);
    /*
  *添加自可变量列表
  */
  for(count = 0;count < n_values;count++ )
  {
   sum += va_arg(var_arg,int);
  }
  va_end(var_arg);
  return sum / n_values;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容