学点C语言(40):函数

像 printf 这种多参函数,是借用 stdarg.h 中的宏实现的.

va_list : 用于定义遍历参数列表的指针;
va_start : 让指针指向第一个参数;
va_arg  : 获取下一个参数,并向后移动一个位置;
va_end  : 释放指针,完成遍历.

1. 整数求和:

本例实现了对系列整数求和,要求至少要有三个参数,并且最后一个必须是 0.

最后的 0 用于识别列表结束.

#include <stdio.h>
#include <stdarg.h>

int sum(int n1,int n2,...)
{
  /* 定义一个指向参数列表的指针,必须是 va_list 类型 */
  va_list p;

  /* 定义输出变量,并先获取前两个值 */
  int out = n1 + n2;

  /* 把指针指向最后一个明确的变量 */
  va_start(p,n2);

  /* 用 va_arg 获取下一个整数值,va_arg 会同时把指针向后移动整数大小的位置 */
  /* 本例是假定参数都是整数值,遇 0 终止; 这样在使用是最后一个参数必须是 0 */
  while ((n2 = va_arg(p,int)) != 0) out += n2;

  /* 结束 */
  va_end(p);

  return(out);
}

int main(void)
{
  printf("%d\n",sum(2,2,2,0));       /* 6 */
  printf("%d\n",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
  getchar();
  return 0;
}

2. 整数求和(修改版):

这个函数要求至少要两个参数,最后必须是 0.

#include <stdio.h>
#include <stdarg.h>

int sum(int n1,...)
{
  va_list p;
  int out = n1;
  va_start(p,n1);
  while ((n1 = va_arg(p,int)) != 0) out += n1;
  va_end(p);
  return(out);
}

int main(void)
{
  printf("%d\n",sum(2,0));         /* 2 */
  printf("%d\n",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
  getchar();
  return 0;
}

时间: 2024-10-27 21:13:24

学点C语言(40):函数的相关文章

学点C语言(39):函数

C语言离不开函数, 使用函数也很方便, 但使用函数是有代价的; 特别是在反复调用时, 函数会因反复地压栈.出栈而浪费一些时间. 下面是测试, 用函数与不用函数的时间分别是: 8秒.4秒! 1. 测试使用函数的代价: #include <stdio.h> #include <time.h> int sum(int x) { return x + x; } int main(void) { int count = 1000000000; int i; int num; time_t s

学点C语言(38):函数

先复习函数的定义与函数的声明: //这是一个求和函数的定义: int add(int x, int y) { return(x + y); } //可以这样声明: int add(int x, int y); //也可以这样声明: int add(int, int); 定义一个函数指针声明一个函数差不多, 用 (* ) 包括函数即可: //像这样: int (*pfun)(int, int); //或这样: int (*pfun)(int x, int y); //也可以: typedef in

学点C语言(33):函数

1. 传值参数(非指针参数): #include <stdio.h> int inc(int x); int main(void) { int num = 1; printf("%d\n",inc(num)); /* 2 */ printf("%d\n",num); /* 1; num 并没有改变,用作函数参数时只是复制过去 */ getchar(); return 0; } int inc(int x) { x++; return x; } 2. 传址

学点C语言(32):函数

C语言的函数可以返回数组以外(不包括数组指针)的任何类型. 不写明返回类型, 在以前的 C 语言版本中是默认返回 int, 现在 C99.C++ 已不支持. void 表示没有返回值, 也就无须 return 语句; 如果是其他语句必须有 return 语句. 在 main 函数中(只是 main 函数)若忘掉 return, 有些编译器会自动添加 return 0; 1. 每执行 return 语句函数将会退出: #include <stdio.h> int main(void) { pri

学点C语言(41):函数

main函数是C程序的入口点,不可或缺,不可重复; main函数应返回一个整数值给操作系统,返回0表示正常结束. 前面使用的main函数都是无参数的: int main(void); main 可以有两个参数: int main(int argc,char *argv[]); 第一个是自动获取的参数数目(+1),第二个是参数列表(字符串列表); 这一般用于控制台或 dos 下, 在 Windows 下我们双击文件名打开文件时,该文件名(包括路径)也是通过这些参数传递的. 1. 获取 main函数

学点C语言(36):函数

数组参数属于指针参数. 指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径. 如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针. 1. 数组参数就是指向第一个元素的指针: #include <stdio.h> void getArr(int p[], int si); int main(void) { int ns[] = {1,2,3,4,5}; getArr(ns, sizeof(ns)/sizeof(ns[0])); getcha

学点C语言(35):函数

1. 递归就是: 函数自己调用自己 这是一个最简单的递归, 不过它会一直执行, 可用Ctrl+C 终止. #include <stdio.h> void prn(void) { printf("C++Builder 2009\n"); prn(); /* 自调用;注意它会一直执行,可用Ctrl+C终止执行 */ } int main(void) { prn(); getchar(); return 0; } 2. 使用递归一定要有跳出的条件: #include <st

学点C语言(34):函数

1. 局部变量: 局部变量也叫自动变量,它声明在函数开始,生存于栈,它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是auto;因可以省略,几乎没人使用 */ printf("%d\n",i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外,一般应在函数前; 每个函数都可以使用它,不过全局变量应尽量少用. #include

学点C语言(31):函数

1. 如果函数没有声明, 应该在调用前定义: #include <stdio.h> /* 定义求大值函数 */ int MAX(int x, int y) { if (x > y) return x; else return y; } /* 定义求小值函数 */ int MIN(int x, int y) { return x < y ? x : y; } int main(void) { int a = 5; int b = 6; /* 调用函数 */ printf("