再次理解C语言的变参
?
实在是令我很郁闷的事啊。
去年用了两天的时间恶补了一下变参,今天看到变参。发现头脑一篇空白,啥都不知道了。
?
古人有云:温故而知新。今日我就在看一遍,做个笔记了。
?
在C语言中,函数参数的传递方式有值传和址传.值传是把实参的一个专用的、临时的复制值给被调函数中相应的形参被调用函数使用、修改这个传来的复制值,不会影响实参的值.址传则是把变量(实参)的地址传给被调函数.被调函数通过这个地址找到该变量的存放位置,直接对该地址中存放的变量的内容进行存取操作.无论是值传还是址传,都要求实参的数目及类型与形参要完全一致。
?
但是在C语言中,在形参表中可以不明确指定传递参数的个数和类型。printf就是一个最好的例子了。这也就是今天要讨论的主要话题--变参函数。
?
下面我们通过对可变长参数函数的理解和设计,加深C语言函数设计的思想方法。
?
在标准文件stdarg.h中包含带参数的宏定义:
#include <stdio.h>#include <stdlib.h>#include <stdarg.h>void printf_diy(char *fmt,...) { va_list arg; char c; va_start(arg, fmt); do { c = *fmt; if(c != '%'){ putchar(c); //输出 } else { fmt++; switch(*fmt) { case 'd': printf("%d", *((int*)arg)); break; case 'x': printf("%#x", *((int*)arg)); break; case 'f': printf("%f", *((float*)arg)); default: break; } va_arg(arg,int); } ++fmt; } while (*fmt != '\0'); va_end(arg); return;}int main(int argc, char **argv) { int i = 1234; int j = 5678; float f = 13.9; printf_diy("i = %d\n", i); printf_diy("j = %d\n", j); printf_diy("f = %f\n", f); return 0;} ?
输出的结果是:
i = 1234
j = 5678
f = -2.000000
?
这里不明白f会输出的是怎么会是“ -2.000000” 。今天就写到这里了,该问题以后解决。哈哈!